【问题标题】:Laravel 8x Response download: binary files always 0 bytesLaravel 8x 响应下载:二进制文件总是 0 字节
【发布时间】:2021-06-10 18:55:51
【问题描述】:

对于任何通过任何途径的有效二进制文件(pdf、图像等),我的下载始终为 0 字节。当我存储该文件或以其他方式访问它时,该文件是有效的。

如果我在任何有效的文本文件(csv、json、txt)上运行 response->download($somePath),则响应是有效且正确的!

我已经尝试过 streamDownload()、file(),我什至尝试过在没有 Symfony 的情况下手动发送响应。我尝试过使用 ob_clean()、flush() 等。我尝试了几种不同的标头,我尝试更改 Cache-Control... 没有任何效果。

这是在 php-fpm 上,带有 nginx,php 7.4。

$path = Storage::disk('test')->url('whatever.pdf');
dump(strlen(File::get($path)); // 5115
if (File::exists($path)) {
    $r = response()
        ->download(
            $path,
            'whatever.pdf',
            [
                'content-length' => strlen(File::get($path)),
                'Content-Type' => 'application/pdf'
            ]
        );
    // $r->headers->set('cache-control', 'private');

    return $r; // 0 bytes returned!

}
``

【问题讨论】:

  • 你尝试过什么调试问题?

标签: php laravel symfony nginx httpresponse


【解决方案1】:

您是否尝试过以下方法:

$path = Storage::disk('test')->url('whatever.pdf');
dump(strlen(File::get($path)); // 5115
if (File::exists($path)) {
    return response()->download(Storage::disk('test')->path('whatever.pdf'));
}

response()->download() 方法需要文件的绝对路径,我认为 ->url() 没有提供。

【讨论】:

    【解决方案2】:

    请求通过节点微服务器路由,响应作为文本处理。

    将响应作为二进制处理解决了这个问题。以前,此服务器仅设置为发送文本。

    res.buffer()
    

    【讨论】:

      猜你喜欢
      • 2020-07-31
      • 1970-01-01
      • 2019-08-13
      • 2012-11-23
      • 2020-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多