Laravel响应下载文件错误地返回为file.txt,而不是其预期的文件名

nnvyjq4y  于 2023-11-20  发布在  其他
关注(0)|答案(1)|浏览(138)

我正在将我的laravel应用程序迁移到laravel 9。然后我注意到响应()->download()现在返回错误的文件名和mime类型。

$headers = [
            'Content-Description' => 'File Transfer',
            'Content-Type' => 'application/zip',
        ];
        return response()
            ->download($result,'test.zip',$headers)
            ->deleteFileAfterSend(true);

字符串
在我的浏览器上,它将返回文件名为“file.txt”,但内容是正确的,将file.txt重命名为file.zip然后文件可访问。
其他信息:

  • 我确实运行了debug,在Response::sendHeaders()中,正确发送的每个头项都包含Content-Disposition:attachment;filename=test.zip
  • 系统升级前:PHP 7.3,Laravel 7.30
  • 升级后:PHP 8.2,Laravel 9.5
  • [更新]这个问题只发生在服务器脚本(php artisan serve)上运行时,同时在web服务器(apache)上运行时正确返回文件名
brc7rcf0

brc7rcf01#

我有类似的问题,浏览器尝试各种优化。
如果您希望浏览器只是下载,而不需要基于文件类型的特殊处理,那么可以尝试以下操作:

$path = $result; // Match OP's naming.

return response()->download($path, 'my-test.zip', [
    'Content-Length' => filesize($path),
    'Content-Type' => 'application/x-msdos-program',
]);

字符串

注意,上面的假是最危险的文件类型,这迫使浏览器应用程序格外谨慎,只需下载文件(没有花哨的特殊处理)。

另外,Content-Length可能已经被Laravel设置了,但我想确保下载是可恢复的。

相关问题