sai*_*ing 6 php google-chrome download
我试图从我的网站下载文件名为GB2312%D5%D5%C6%AC.JPG的文件,一切顺利在IE9/Firefox中,但在谷歌浏览器中没有.
在谷歌浏览器中,此文件名将替换为我的下载页面名称(可能Chrome无法解码文件名).
要查看Chrome是否要解码文件名,我尝试使用另一个字符串GB2312%2C%2D%2E.txt作为文件名,firefox/IE9仍然按预期工作,但谷歌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
Run Code Online (Sandbox Code Playgroud)
我刚刚遇到了这个问题。这个问题很有帮助。
正如您所指出的,原因是 Chrome 正在尝试对其进行解码,但它超出了 ASCII 范围。我个人认为这是一个错误。
基本上让它在 Chrome 中工作的答案是使用这个:
Content-Disposition:attachment; filename*=UTF-8''GB2312%D5%D5%C6%AC.JPG
Run Code Online (Sandbox Code Playgroud)
然而,这会在 IE8 和 Safari 中破坏它。啊! 因此,为了让它在这些中也能工作,请尝试像这个例子一样进行操作。
Content-Disposition:attachment; filename="GB2312%D5%D5%C6%AC.JPG"; filename*=UTF-8''GB2312%D5%D5%C6%AC.JPG
Run Code Online (Sandbox Code Playgroud)
对我来说,我必须先对文件名进行 url 编码,然后再将其放入 filename*=UTF-8 部分。所以我的第一个文件名和第二个文件名的值不同。我使用 PHP,我的代码如下所示:
$encodedfilename = urlencode($downloadfilename);
header("Content-Disposition: attachment; filename=\"$downloadfilename\"; filename*=UTF-8''$encodedfilename");
Run Code Online (Sandbox Code Playgroud)
所以我实际上并没有像你要求的那样阻止它进行编码,而是对它进行编码,然后将由 Chrome 解码的参数传递回它应该的样子。