添付ファイルダウンロードで日本語ファイル名が文字化けする

メッセージ

添付ファイルが日本語ファイル名である場合、ダウンロード時に文字化けが発生します。

また、PHP5.4で動作させた場合、含まれている文字によっては "index" というファイル名でダウンロードされます。

環境

原因

attach.inc.php : 709 の open() で

 709  case 'MSIE/default':
 710    $filename = mb_convert_encoding($filename, 'SJIS', 'auto');
 711    break;
    ...
 714 $filename = htmlsc($filename);
 
 720 header('Content-Disposition: inline; filename="' . $filename . '"');

710行目で SJIS に変換しているが、これは古いIE(IE8以前)の動作にあわせた実装

714行目の htmlsc(htmlspecialchars)は、ここで使うのは適切でない。 SJISバイナリそのままhttp_outputに渡すのが元の意図と思われる。

ref.inc.php にも同じ問題がある。

解決策

2014年7月現在、多くのWebブラウザが RFC 6266 に対応しているので、RFC 6266 (Content-Disposition: filename*=utf-8''<rawurlencode_file_name>) を実装することで日本語を含むnon-ASCII文字を含むファイル名を正しくダウンロードできる。

また、旧実装(filename=)を残しておくことで古いブラウザに対しては今まで通りの動作となる。

リポジトリに取り込まれた実装

修正実装案

plugin/attach.inc.php

diff --git a/plugin/attach.inc.php b/plugin/attach.inc.php
index ce7f70e..355a428 100644
--- a/plugin/attach.inc.php
+++ b/plugin/attach.inc.php
@@ -711,13 +711,13 @@ EOD;
 				break;
 			}
 		}
-		$filename = htmlsc($filename);
+		$utf8filename = mb_convert_encoding($filename, 'UTF-8', 'auto');
 
 		ini_set('default_charset', '');
 		mb_http_output('pass');
 
 		pkwk_common_headers();
-		header('Content-Disposition: inline; filename="' . $filename . '"');
+		header('Content-Disposition: inline; filename="' . $filename . '"; filename*=utf-8\'\'' . rawurlencode($utf8filename));
 		header('Content-Length: ' . $this->size);
 		header('Content-Type: '   . $this->type);

URL: sourceforge.jp/users/umorigu/pf/pukiwiki15/scm/commits/b8dda6bf557989c0324c3002f242d997cd91cebd

plugin/ref.inc.php

diff --git a/plugin/ref.inc.php b/plugin/ref.inc.php
index cb3fe32..f0095cf 100644
--- a/plugin/ref.inc.php
+++ b/plugin/ref.inc.php
@@ -420,12 +420,12 @@ function plugin_ref_action()
 			break;
 		}
 	}
-	$file = htmlsc($filename);
+	$utf8filename = mb_convert_encoding($filename, 'UTF-8', 'auto');
 	$size = filesize($ref);
 
 	// Output
 	pkwk_common_headers();
-	header('Content-Disposition: inline; filename="' . $filename . '"');
+	header('Content-Disposition: inline; filename="' . $filename . '"; filename*=utf-8\'\'' . rawurlencode($utf8filename));
 	header('Content-Length: ' . $size);
 	header('Content-Type: '   . $type);
 	@readfile($ref);

URL: sourceforge.jp/users/umorigu/pf/pukiwiki15/scm/commits/b8dda6bf557989c0324c3002f242d997cd91cebd

補足




トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-02-07 (日) 18:23:21
Site admin: PukiWiki Development Team

PukiWiki 1.5.3+ © 2001-2020 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u11. HTML convert time: 0.243 sec.

OSDN