以前に,別のディスカッショントピックで提案したように,IEで日本語ファイル名をダウンロードできるようにするために行った改良の結果,attachmentではファイル名が文字化けしなくなりました.
function convert_download_filename_encoding($filename) {
if (check_browser_version('MSIE')) {
if (strlen(rawurlencode($filename)) > 21 * 3 * 3) {
$filename = mb_convert_encoding($filename, "SJIS-WIN", "UTF-8");
$filename = str_replace('#', '%23', $filename);
} else {
$filename = rawurlencode($filename);
}
} else if (check_browser_version('Safari')) {
$filename = "";
}
return $filename;
}
ところでつい先日気付いたのですが,attachmentではなく,inlineでWebブラウザ上に表示させた画像をIE7の右クリック,”名前を付けて画像を保存”でファイル保存先のダイアログに入力されるファイル名が(添付画像のように)URLエンコードされたファイル名になります.例えば以下のように,file.phpを介して画面表示される画像の場合です
<img title="ライダー" height="192" alt="ライダー" hspace="0" src="/mech/moodle/file.php/42/%E3%81%B0%E3%81%84%E3%81%8F.jpg" width="178" border="0" />
ポイントはlib/filelib.phpのfunction send_file()の中の以下の部分だと思います.
header('Last-Modified: '. gmdate('D, d M Y H:i:s', $lastmodified) .' GMT');
// if user is using IE, urlencode the filename so that multibyte file name will show up correctly on popup
// if (check_browser_version('MSIE')) {
// $filename = urlencode($filename);
// }
$filename = convert_download_filename_encoding($filename); // (ADD)if ($forcedownload) {
// @header('Content-Disposition: attachment; filename='.$filename);
@header('Content-Disposition: attachment; filename="'.$filename.'"');
} else {
// @header('Content-Disposition: inline; filename='.$filename);
@header('Content-Disposition: inline; filename="'.$filename.'"');
}
オリジナルに対して赤い部分を修正してあります.ブラウザがIEの場合,$filenameは(文字数が短い場合は)rawurlencode()されたUTF-8のファイル名です.
青い文字で表した1行,こちらがインライン表示時に利用される部分ですので,こちらの$filenameのエンコードを色々と変えてみました.
まずはrawurldecode()して単なるUTF-8にしたところ,文字化けしました.では,ここもS-JISか?と思い,rawurlencode()してUTF-8に戻したものをmb_convert_encoding()でSJIS_WINに変換したら,元と同じくURLエンコードされたファイル名になりました....ならばSafariのように,$filenameを''(空)にしてみたら...この場合もURLエンコードされたファイル名です.キャッシュのせいかも知れないと思い,$filenameを適当なANK文字(例えば,bike.jpgなど)に変えると,その名前でダウンロードできます.
attachmentの場合は問題が解決したのですが,inlineでその画像のファイル名を取得するメカニズムがよく分かっていません.もしかしてWebブラウザだけではなく,Apacheも絡んでくるのでしょうか.なお,WebブラウザがFirefoxの場合は何も問題はありません.