下载时Chrome无法识别网址编码的文件名

时间:2012-04-18 03:38:47

标签: php google-chrome download

我尝试从我的网站下载文件名为GB2312%D5%D5%C6%AC.JPG的文件,在IE9 / Firefox中一切顺利,但在谷歌浏览器中没有。

在谷歌浏览器中,此文件名将替换为我的下载页面名称(可能Chrome无法解码文件名)。

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

如何阻止Google Chrome解码文件名?如果我能在服务器端(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

1 个答案:

答案 0 :(得分:4)

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

正如您所指出的,原因是Chrome正在尝试对其进行解码,而且它不在ASCII之内。我个人称之为个bug。

基本上,让它在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

对我来说,我必须在将文件名放入文件名* = UTF-8之前对文件名进行url编码。所以我的第一个文件名和第二个文件名的值不一样。我使用PHP,我的代码如下:

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

所以我实际上并没有像你要求的那样停止编码,但是我对它进行了编码,然后将Chrome解码后的参数传递回原来的版本。