火狐浏览器与Content-Disposition头部信息

9

我遇到了一个附件名称的问题。当我在 Google Chrome 上访问该网站时,它会以正确的名称和扩展名返回该文件。我在 Internet Explorer 上测试过,也能正常工作。这个问题只存在于 Firefox 中。我调用该网站并返回文件标题的第一个单词和没有扩展名。

例如,如果我想要一个名为“我的报告.docx”的文件,它会变成一个名为“我的”文件。我搜索了一下谷歌,发现这是一个普遍的问题,因为浏览器读取头部的方式不同。他们说解决方法是引用文件名:

Content-Disposition: attachment; filename=My Report.docx

现在是这样的:(请注意引号)

Content-Disposition: attachment; filename="My Report.docx"

然而,这对我没用。

在 Chrome 上,它会返回“我的报告.docx”(实际上有引号)。Firefox 返回了一个奇怪的文件,它具有正确的扩展名和正确的名称,没有引号但无法执行。它的大小、扩展名和名称都正确,但却无法执行。还返回文件名前后的空格。


3
可能是重复的问题:如何在HTTP的Content-Disposition头中编码文件名参数? - Asad Saeeduddin
1
如果你想知道为什么你的Firefox忽略了这个头部信息,请检查你是否安装了InlineDisposition插件:它是一个很棒的插件,专门用于禁用Content-Disposition强制下载,并且在进行Web开发时很容易被忘记。 - Roman Starkov
2
双引号在我的IE、Chrome和FireFox中都可以正常工作,使用的是最新版本。 - angularsen
2个回答

5
我知道这是一个很老的问题,但我最近也遇到了同样的问题。解决方案要么是:
  1. 根据RFC2184编码您的文件名,要么
  2. 如果您的文件名中没有特殊字符,请在内容分发字符串中进行引用。
既然您已经尝试过第2种方法,您可以尝试使用第1种方法,并查看其效果。
通常情况下,我使用ContentDisposition类来为我生成标题:
Dim contentDispositionHeader = New Net.Mime.ContentDisposition() With {.FileName = filename}
Response.AddHeader("Content-Disposition", contentDispositionHeader.ToString())

希望这能有所帮助。

4

这应该按预期工作,这里有一个相同问题的SOq:

还有 Mozilla 页面(我想你在引用这个):

我不知道您的服务器端代码的具体情况,但以下是一些要确认 / 尝试的事项:

  • 如果您的服务器上有 PHP,请尝试使用上面链接中的代码。如果没有,您可能可以在您选择的语言中找到一些内容。这样,您就可以确认问题是在您的代码中还是其他地方(服务器设置、浏览器等)。
  • 这是否发生在其他客户端机器上(即您尝试从哪里下载)还是仅在某个机器上?您可能需要尝试其他机器以进行确认。
  • 这在 IE / Safari 或其他浏览器中是否正常工作?您甚至可以尝试使用命令行中的 wgetcurl 等工具。
  • 您是否正确提供了 Content-Type 标头?
  • 您是否可以尝试下载其他文件或不同类型的文件,例如 .png.xls?实际上,最简单的是尝试一个纯文本文件(text/plain),然后从那里开始。

希望这能有所帮助。


好的,谢谢回复。但是第一个链接就是我在 PHP 代码中所做的事情。是的,那就是我所指的东西。我试图按照它所说的引用它,但它只是在文件名前后放置了额外的空格,所以它会像“我的报告.docx”这样,这就是为什么它无法被执行的原因。我尝试使用 str_replace(),但没有成功。我尝试了所有方法。我可以让它在一个浏览器上工作,但在另一个浏览器上就会出问题...几乎不可能找到平衡点...我也没有提供 Content-Type 头。 - Garrett R
好的,我弄清楚了这个该死的烦恼是怎么回事。原来是因为我用一个变量作为名称。我的代码如下: $name2 = "filename="."$name"; header('Content-Disposition: attachment; '.$name2); 当服务器处理时,它会将变量中的"$"视为空格。我得想办法绕过去……我不知道这是否可能 -.- - Garrett R

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