【问题标题】:Laravel: How to create a download response for an external file?Laravel:如何为外部文件创建下载响应?
【发布时间】:2017-05-23 09:41:21
【问题描述】:

我知道已经有 questions about downloading files 使用 Laravel,但我发现的都是处理 本地 文件。

所以,通常情况下,我会这样做:

$path = storage_path().'/my-file.pdf';
$name = 'new-name.pdf';
$headers = '....';

return response()->download($path, $name, $headers);

但是我该怎么办,当我需要下载的文件是外部文件时,位于 www.my-storage.net/files/123/my-file.pdf 下 em> ?

我可以使用 copy() 函数,或者 file_get_contents() 和 Laravel 的 Storage::put() 的组合,但是我不想每次都将文件存储在本地(临时)正在处理下载。相反,我想直接通过用户的浏览器下载外部文件。

在普通的 PHP 中,它类似于 this。但是……

(1) 我该如何准备这样的 Laravel 下载响应?

(2) 如何确保 Laravel 解决方案保持高效(例如,没有内存泄漏)?

【问题讨论】:

    标签: php laravel download laravel-5.2


    【解决方案1】:

    类似以下的方法会起作用:

     return response()->stream(function () {
          //Can add logic to chunk the file here if you want but the point is to stream data
          readfile("remote file");
     },200, [ "Content-Type" => "application/pdf", 
              "Content-Length" => "optionally add this if you know it", 
               "Content-Disposition" => "attachment; filename=\"filename.pdf\"" 
    ]);
    

    这通过使用 Symphony 的 StreamedResponse 来工作

    【讨论】:

    • 部分文件大小为 100MB。对较大文件使用stream() 方法有任何已知的担忧吗?我还是应该分块文件吗?
    • @lesssugar 这个特殊的解决方案使用readfile,它不会预加载文件而是流式传输文件,但是请查看readfile() 的注释,它说:readfile( ) 不会出现任何内存问题,即使在单独发送大文件时也是如此。如果遇到内存不足错误,请确保使用 ob_get_level() 关闭输出缓冲。
    • 你确定回调正确吗?目前,浏览器输出文件内容而不是下载文件。我正在传递文件 URL 来代替 'remote file' 值。我也试过设置"Content-Type: application/octet-stream"
    • 我的错,在返回响应之前我有另一个输出,这中断了调用。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 2020-03-12
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    相关资源
    最近更新 更多