【问题标题】:How to get file from storage by public URL?如何通过公共 URL 从存储中获取文件?
【发布时间】:2019-10-13 20:29:16
【问题描述】:

我有应用 Laravel。

路径有一个存储:\storage\app\reports\

我试图通过 GET url 获取文件,例如:

http://localhost:8000/storage/app/reports/report_27-05-19_05.xlsx

但这对我不起作用。

我也尝试在后端返回文件:

$file = File::get(storage_path($path.$filename));
$type = File::mimeType($path.$filename);

$response = Response::make($file, 200);
$response->header("Content-Type", $type);

return $response;

【问题讨论】:

    标签: laravel laravel-5


    【解决方案1】:

    在配置文件夹中打开您的 filesystem.php。

    'reports' => [
            'driver' => 'local',
            'root' => storage_path('app/reports'),
            'url' => env('APP_URL').'/storage/app/reports',
            'visibility' => 'public',
        ],
    

    将此添加到磁盘阵列。

    在符号链接可能有效之后。从未尝试过,但可以工作。试试看吧。

    【讨论】:

    • 又如何使用呢?
    • 如何存储和获取?
    • 喜欢这个? ` Storage::disk('reports')->put($path.$filename, $content);` ?
    • 例如在刀片文件上,您可以像 => reports($file->filename) 一样调用,是的,Storage::disk('reports') 可以分配给相关文件夹。
    • 如何通过路径获取文件? \storage\app\reports\file.xml?
    【解决方案2】:

    试试这样的。

    以下示例是存储在共享主机中的 csv 文件

    $filename 是保存文件的名称,将与get 请求一起传递

    public function download($filename)
    {
        $name = $filename;
        $file = $file = '/home/USERNAME/storage/report/'.$name;
    
        $header = array(
            'Content-Type' => 'application/csv',
            'Content-Disposition' => 'attachment',
            'Content-lenght' => filesize($file),
            'filename' => $name,
        );
    
        // auth code
        return Response::download($file, $name, $header);
    }
    

    【讨论】:

    • 使用目录的绝对路径是不好的做法 + Content-Type 强制文件作为application/csv 提供服务。也不需要发送这些额外的标头。 link
    • 是的,我知道这是一种不好的做法。如果不在共享主机上使用它,我就无法下载我的文件。另外,我想在用户登录时只下载 csv。这就是我在这里发布旧代码的原因。它是在 Laravel 5.4 上编码的
    【解决方案3】:

    如果您希望文件可公开访问(无需控制器),则您的文件位于错误的文件夹中。

    符号链接

    如果您希望您的文件可以公开访问。

    1. 将文件移动到storage/app/public,运行php artisan storage:link。这会将storage/app/public 符号链接到public/storage。您的文件现在可以通过http://localhost:8000/storage/report_27-05-19_05.xlsx 公开访问

    服务文件

    您还可以使用 Laravel / PHP 通过控制器提供文件。

    1. 通过控制器检索文件:
    $filename = "Example.docx";
    return response()->download(storage_path("app/reports/{$fileName}"));
    

    【讨论】:

    • 是的,它可以工作,但我在响应网络中获取二进制文件而不是下载文件
    • 我可以在客户端获得二进制响应并使用 js 在新窗口中打开吗?
    • @OPV 如果您收到二进制流而不是文件下载,则表明您的网络服务器配置有问题。 Laravel 已经默认设置了正确的 headers,在使用响应时,下载功能。
    猜你喜欢
    • 2021-09-08
    • 2015-04-11
    • 2017-10-03
    • 2020-03-26
    • 1970-01-01
    • 2021-08-12
    • 2016-03-29
    • 1970-01-01
    • 2016-10-26
    相关资源
    最近更新 更多