半角空白を含むファイルをFirefoxでダウンロードしようとすると,半角空白以降が消えてしまうという問題に遭遇しました.例えば,"情報班の常識 (Wiki).zip"が,"情報班の常識"というファイル名でダウンロードされます.(”常識”と”(”の間に半角の空白あり)
この問題の原因箇所は,lib/filelib.php中のsend_file()にあり,295行目あたりから始まるヘッダー情報の送出に関わっているようですね.丁度,別件(Wikiのエクスポート)で悩んでいた問題と偶然にも一致します).
if ($forcedownload) {
@header('Content-Disposition: attachment; filename='.$filename);
} else {
@header('Content-Disposition: inline; filename='.$filename);
}
ファイルのダウンロード時は$forcedownloadがゼロでしたので,attachmentではなく,inlineの側のheader()が関わっています.
当初は,
if ($forcedownload) {
@header('Content-Disposition: attachment; filename='.$filename);
} else {
// @header('Content-Disposition: inline; filename='.$filename);
@header('Content-Disposition: inline; filename*=iso-2022-jp\'ja\''.rawurlencode($filename));
}
とすることで無事にIE6でもFirefoxでもダウンロードできるようになりました.さらに何の気もなしに,
if ($forcedownload) {
@header('Content-Disposition: attachment; filename='.$filename);
} else {
// @header('Content-Disposition: inline; filename='.$filename);
// @header('Content-Disposition: inline; filename*=iso-2022-jp\'ja\''.rawurlencode($filename));
}
のように完全にコメントアウトしても正しくダウンロードできることを発見.上の方の行のコメントを外すと化けますので,単に$filnameを与えただけでは誤動作するので,いっそのこと省略してしまった方がマシだ,ということなのでしょうか.
(この解釈は
奥村先生のページを参考にしました)
filename*=iso-2022-jpといった表現は古いブラウザーでも対応しているのか,Content-Dispositionを省略しても正しいファイル名でダウンロードできるのか,という検証は多くのブラウザとそのバージョンをチェックしないといけないのかも知れません.IE6SP2とFIrefox2では大丈夫らしい,という報告です.
ちなみに,files.phpの最後の方に奥村先生が追加された,
$filename = str_replace('#', '%23', $filename);
ですが,上記iso-2022といった指定やContent-Dispositionを省略した場合においては,逆に副作用が出ました."情報#班の常識 (Wiki).zip"という変な名前にリネームしてダウンロードをしてみたところ,"情報%20班の常識 (Wiki).zip"となりました.一部だけurlencode()が有効な場合と無効な場合はどこにあるのか分かりませんが,私の環境(Firefox2.0.0.5)では,str_replace()は不要のようです.