谷歌浏览器在下载文件时添加了“-, attachment”后缀

7

我使用Symfony2框架,并使用以下代码导出Xml文件:

$response->setStatusCode(200);
$response->headers->set('Content-Type', 'application/xml');
$response->headers->set('Content-Description', 'Submissions Export');
$response->headers->set('Content-Disposition', 'attachment; filename="' . $filename .'"');
$response->headers->set('Content-Transfer-Encoding', 'binary');
$response->headers->set('Pragma', 'no-cache');
$response->headers->set('Expires', '0');

无论我是否删除"Content-Transfer-Encoding"或"Pragma",除了"Content-Type"和"Content-Disposition"之外的所有内容都不重要。在Chrome中的结果始终为:"filename-, attachment"(不带"-")。

而在Firefox中可以正常工作。

例如,如果我的文件名为home.xml,则Firefox将下载home.xml,而Chrome将给我home.xml-, attachment。


1
可能是此问题的重复:https://dev59.com/QljUa4cB1Zd3GeqPUcVk - Akshaya Shanbhogue
据我所知,这是一个不同的问题。众所周知,Chrome会将"转换为-(出于某种原因)。也许它已经被修复了。我认为我的问题与任何类型的转换都无关。Chrome似乎会出于某种原因更改文件名,无论我使用xml、pdf还是任何其他类型的文件。 - Micha
据我所知,你的代码文件名末尾也有一个引号,即$filename .'"'。为什么不移除引号然后再检查一遍呢 :) - Akshaya Shanbhogue
我做过很多次了。没有引号,只有“,\”,','等符号,这并没有解决问题/反而创造了(有趣的)新问题。 - Micha
2
@Akshay 我明白了。你提供的那篇帖子并不是同样的问题,但它帮助我找到了解决方案。"-" 表示确实有一个双引号被转换了,而 "," 则表示某种 "额外" 的文件。解决方案是:在开发过程中,我不小心发送了两次 Headers -.- 谢谢 :) - Micha
  1. 消除无意义的头部字段(Content-Description,Content-Transfer-Encoding)
  2. 获取实际上发送到网络的HTTP跟踪数据(或者检查浏览器中的头部字段)
  3. 请注意,对于非ASCII字符,仅引用文件名将无法正常工作,请参阅http://greenbytes.de/tech/webdav/rfc6266.html了解详情。
- Julian Reschke
2个回答

3

我知道这是一个相当旧的讨论,但如果有人在这里寻求帮助,我确定Chrome似乎需要在文件名末尾加上分号,然后它就会满意了。就像这样(VBScript):

Response.AddHeader "Content-Disposition", "attachment;filename=Something.xls;"

这对我很有帮助。 -Dave

真的吗?这显示了一个“重复的内容-分配”错误,并且对我来说停止了。我仍在寻找解决方案,我在这里提交了一个错误:https://code.google.com/p/chromium/issues/detail?id=487906 - Hackeron

1

我在ZEND中遇到了同样的问题,因为我发现了很多不起作用的东西,我想把我的答案添加到这篇文章中。由于我花了一些时间来解决它,所以我认为更多的用户和开发人员会想知道我是如何解决它的。在我的fopen调用之前,我添加了以下内容。

header('Content-Disposition: attachment; filename='.time().'.csv');

问题已经解决。之前我使用了一个有缺陷的上下文切换,但现在它完美地工作了。不要忘记删除先前的内容分发标头,否则可能会出现双重标头错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接