6

私のサイトから GB2312%D5%D5%C6%AC.JPG というファイル名のファイルをダウンロードしようとしましたが、すべて IE9/Firefox ではうまくいきますが、Google Chrome ではうまくいきません。

Google Chrome では、このファイル名はダウンロード ページ名に置き換えられます (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
4

1 に答える 1

4

私はまさにこの問題を抱えていました。この質問は役に立ちました。

原因は、ご指摘のとおり、Chrome がデコードしようとしており、ASCII の範囲外にあるためです。個人的にはバグと呼んでいます。

基本的に、Chrome で動作させるための答えは、これを使用することです。

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

ただし、これは IE8 と Safari では機能しません。うーん!したがって、それらでも機能させるには、この例のようにしてみてください。

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

私にとっては、filename*=UTF-8 の部分に入れる前に、ファイル名を URL エンコードする必要がありました。したがって、最初のファイル名と 2 番目のファイル名の値は同じではありません。私はPHPを使用しましたが、コードは次のようになります。

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

したがって、あなたが要求したように実際にエンコードを停止しているわけではありませんが、エンコードしてから、Chromeによってデコードされたパラメーターを本来の状態に戻します。

于 2012-10-18T18:24:46.487 に答える