-
- $filename = "document.txt";
- header('Content-Type: application/octet-stream');
- header('Content-Disposition:attachment; filename=' . $ filename);
- print "Hello!";
- ?>
-
コードをコピー
ブラウザで開くと、document.txtをダウンロードできます。
ただし、$filename が UTF-8 でエンコードされている場合、一部のブラウザーはそれを適切に処理できません。
例:
-
- $filename = "中国語ファイル名.txt";
- header('Content-Type: application/octet-stream');
- header('Content-Disposition:attachment; filename= ' . $filename);
-
- print "Hello!";
- ?>
-
コードをコピー
プログラムをUTF-8エンコードで保存して再度アクセスすると、IE6でダウンロードしたファイル名が文字化けします。
FF3でダウンロードしたファイル名には「中国語」という単語しか入っていません。 Opera 9 ではすべて正常に動作します。
出力ヘッダー:
Content-Disposition: 添付ファイル名=中文 filename.txt
実際、RFC2231 の定義によれば、多言語エンコーディングの Content-Disposition は次のように定義される必要があります。
コンテンツの配置: 添付ファイル名*="utf8''%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt"
今すぐ:
ファイル名の後の等号は * で始まる必要があります。ファイル名の値は、文字セット (utf8)、言語 (空)、および URL コード化されたファイル名という 3 つのセグメントに一重引用符で囲まれて分割されます。二重引用符を追加することをお勧めします。それ以外の場合は、ファイル名のスペースの後の部分を追加します。
Firefoxでは表示されません。
urlencode の結果は、php の urlencode 関数の結果と同じではないことに注意してください。PHP の urlencode はスペースを + に置き換えますが、ここでは %20 に置き換える必要があります。
テストの結果、いくつかの主流ブラウザのサポートは次のとおりであることが判明しました。
-
- $filename = "中国語のファイル名.txt";
- $encoded_filename = urlencode($filename);
- $encoded_filename = str_replace("+", "%20", $encoded_filename) ;
- $ua = $_SERVER["HTTP_USER_AGENT"];
- header('Content-Type: application/octet-stream');
- if (preg_match("/MSIE/", $ua)) { // bbs.it -home.org
- header('Content-Disposition:attachment; filename="' . $encoded_filename . '"');
- } else if (preg_match("/Firefox/", $ua)) {
- header('Content -Disposition:attachment; filename*="utf8''' . $filename . '"');
- } else {
- header('Content-Disposition:attachment; filename="' . $filename . '"');
- }
- print 'ABC';
- ?>
コードをコピー
|