我最近遇到了一个工作正常的代码问题,但随后开始在文件名周围加上引号。
我们最近已将服务器升级到PHP 7.2,并认为这可能是导致更改的原因,但希望了解是否有人可以肯定。
我们正在使用PHP 7.2的Ubuntu服务器上运行Laravel 5.5应用,并且据观察,它在Chrome(我们使用的主要浏览器)中可以正常工作,而不再可用
以下代码可以正常工作几个月:
$file = Storage::disk('s3')->get($location);
$headers = [
'Content-Type' => 'xml',
'Content-Description' => 'File Transfer',
'Content-Disposition' => "attachment; filename='" . $realName . "'",
'filename'=> $realName
];
return response($file, 200, $headers);
这会很好地下载example.xml
但是最近它开始下载“ example.xml”,要求我删除引号:
$file = Storage::disk('s3')->get($location);
$headers = [
'Content-Type' => 'xml',
'Content-Description' => 'File Transfer',
'Content-Disposition' => 'attachment; filename=' . $realName,
'filename'=> $realName
];
return response($file, 200, $headers);
我已经看到了多种文件类型的问题,因此与文件类型无关。
我只是想找出导致此问题的原因,特别是因为引号的包含是出于我所理解的向后浏览器兼容性的需要。
**更新**
我找到了这个相关的问题,但是没有回答我追寻的问题:
PDF downloads surrounded by single quotes?
**更新2 **
我已经在多种浏览器上测试了引号,并且它不适用于Chrome和Firefox,但可以在当前版本中与Internet Explorer&Edge一起使用。
答案 0 :(得分:2)
尝试一下:
'Content-Disposition' => "attachment; filename=\"$realName\"",
似乎用单引号引起来的文件名是无效的:https://stackoverflow.com/a/31976390/6038111
没有双引号,我的猜测是浏览器假设单引号是文件名的一部分。我无法告诉您发生了什么变化,导致它无法像以前那样工作,但是我可能猜测您的浏览器已更新,并且不再支持无效的单引号。
编辑:确实看起来Chrome 72更改了其行为:https://bugs.chromium.org/p/chromium/issues/detail?id=927913
Laravel的另一种特定替代方法是作为存储系统一部分的内置文件下载方法。这样,您不必考虑单引号还是双引号:
return Storage::disk('s3')->download($location, $realName, [
'Content-Type' => 'text/xml',
'Content-Description' => 'File Transfer',
]);
注意:这将首先将文件下载到服务器,然后再发送给用户(就像您的代码一样),这会增加行程,从而增加延迟。凡是来自Google的人都可能想检出url()
和temporaryUrl()
可用于S3,Rackspace以及支持它的任何其他文件系统驱动程序:https://laravel.com/docs/5.7/filesystem#file-urls