php - Chrome 在下载时无法识别 url 编码的文件名

标签 php google-chrome download

我尝试从我的站点下载文件名为 GB2312%D5%D5%C6%AC.JPG 的文件,在 IE9/Firefox 中一切正常,但在 Google Chrome 中不正常。

在 Google Chrome 中,这个文件名被我的下载页面名称替换(可能是 Chrome 无法解码文件名)。

为了查明 Chrome 是否试图解码文件名,我尝试使用另一个字符串 GB2312%2C%2D%2E.txt 作为文件名,firefox/IE9 仍然按预期工作,但 Google Chrome 将尝试解码此文件名(将 %2D 替换为“-”)。

如何防止谷歌浏览器解码文件名?如果我能在我的服务器端 (PHP) 解决这个问题就更好了

以下几行是我的服务器生成的响应头。

**Response Headers:**
Cache-Control:must-revalidate, post-check=0, pre-check=0, private
Connection:keep-alive
Content-Description:File Transfer
Content-Disposition:attachment; filename="GB2312%D5%D5%C6%AC.JPG"
Content-Length:121969
Content-Transfer-Encoding:binary
Content-Type:application/force-download; charset=UTF-8
Date:Wed, 18 Apr 2012 03:32:30 GMT
Expires:0
Pragma:public
Server:nginx/1.1.5
X-Powered-By:PHP/5.3.8

最佳答案

我刚刚遇到了这个问题。 This question很有帮助。

正如您所指出的,原因是 Chrome 正在尝试解码它并且它在 ASCII 之外。我个人认为这是一个错误。

基本上让它在 Chrome 中工作的答案是使用这个:

Content-Disposition:attachment; filename*=UTF-8''GB2312%D5%D5%C6%AC.JPG

但是,这会在 IE8 和 Safari 中破坏它。啊!所以为了让它在那些地方也能工作,试着像this example那样做.

Content-Disposition:attachment; filename="GB2312%D5%D5%C6%AC.JPG"; filename*=UTF-8''GB2312%D5%D5%C6%AC.JPG

对我来说,我必须先对文件名进行 url 编码,然后再将其放入文件名*=UTF-8 部分。所以我对第一个文件名和第二个文件名的值不一样。我使用 PHP,我的代码如下所示:

$encodedfilename = urlencode($downloadfilename);
header("Content-Disposition: attachment; filename=\"$downloadfilename\"; filename*=UTF-8''$encodedfilename");

所以我实际上并没有像您要求的那样阻止它进行编码,而是对其进行了编码,然后将由 Chrome 解码的参数传递回它应该是的样子。

关于php - Chrome 在下载时无法识别 url 编码的文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10202437/

相关文章:

asp.net-mvc - 如何在 AsyncControl 中使用 MVC 下载文件?

php - 带有字符的子页面/

php - XPATH - 选择具有特定属性的所有子节点

php - mysql_fetch_assoc() 的结果将旧值复合到新值上。有任何想法吗?

javascript - 如何检测访问者使用的是 HTTP/2 还是 SPDY?

javascript - 加载 chrome 扩展并找到当前网站 javascript

php strtotime 返回 1970-01-01

javascript - Chrome 扩展 : communication between iframe and popup

php - 通过 PHP 从 Internet 流式传输文件很慢

java - Android Market以编程方式获取确切的下载数量