【问题标题】:Downloads start to get encased in Quotes下载开始包含在报价中
【发布时间】:2019-02-25 01:12:32
【问题描述】:

我最近遇到了一个代码问题,该代码运行良好,但随后开始在文件名周围包含引号。

我们最近将服务器升级到 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 **

我已经在多个浏览器上测试了 signle 引号,它不适用于 Chrome 和 Firefox,但可以在当前版本的 Internet Explorer 和 Edge 上使用。

【问题讨论】:

  • $file 是路径还是 File 对象? $realName 的价值是多少?
  • 抱歉 $file 是文件对象,我将其添加到代码中
  • 单引号永远无效。你应该使用双引号。 developer.mozilla.org/en-US/docs/Web/HTTP/Headers/…
  • @lufc 感谢分享。我在这里使用了大学代码并且正在工作,所以在它停止工作之前没有三思而后行
  • 没有问题。我怀疑是浏览器更新导致它停止工作。

标签: php laravel download http-headers


【解决方案1】:

试试这个:

'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 来到这里的人都可能想查看 S3、Rackspace 和任何其他支持它的文件系统驱动程序的 url()temporaryUrl()https://laravel.com/docs/5.7/filesystem#file-urls

【讨论】:

  • 感谢特拉维斯的回复。我已经看到了转义的双引号,但没有看到单引号无效
  • 奇怪的是,直到大约一个月前,单引号都可以正常工作。
  • 我不能告诉你它为什么起作用,但就像我说的那样,我猜你的浏览器曾经支持单引号,即使根据规范它们是无效的。我还更新了 Laravel 特有的下载替代方法
  • 谢谢特拉维斯。我没有意识到这会奏效。下次我从 S3 下载时,我必须记住这一点
  • @Josh 看起来是 chrome 72 改变了:bugs.chromium.org/p/chromium/issues/detail?id=927913
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
  • 2016-02-01
  • 2011-02-13
  • 1970-01-01
相关资源
最近更新 更多