下载开始包含在引号中

时间:2019-02-25 01:12:33

标签: php laravel download http-headers

我最近遇到了一个工作正常的代码问题,但随后开始在文件名周围加上引号。

我们最近已将服务器升级到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一起使用。

1 个答案:

答案 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