June 25, 2008
response headers in the download script
日本語ファイル名のファイルをダウンロードさせる場合、少しブラウザ(ユーザエージェント)を気にする必要がある。
Safariはサーバ側でどうにもできないため、ダウンロードリンクの最後(ファイル名として扱われる)をファイル名をURLデコードしたものにする。
Safariはサーバ側でどうにもできないため、ダウンロードリンクの最後(ファイル名として扱われる)をファイル名をURLデコードしたものにする。
<a href="/dlscript/<?php echo urlencode($filename) ?>"> <?php echo htmlentities($filename, ENT_QUOTES) ?> </a>サーバ側では、IEの場合にヘッダに付加するファイル名をShift-JISに変換する。Safariの場合はヘッダにファイル名を付加しない(付加すると文字化けする)。
$filename = urldecode($filename);
$path = "/path/to/" . $filename;
header("Content-Type: application/octet-stream");
header("Content-Length: " . filesize($path));
$ua = (isset($_SERVER["HTTP_USER_AGENT"])) ? $_SERVER["HTTP_USER_AGENT"] : "unknown";
if (strpos($ua, "MSIE") !== false) {
$filename = mb_convert_encoding($filename, "SJIS", "UTF-8");
}
if (strpos($ua, "Safari") === false) {
header("Content-Disposition: attachment; filename="' . $filename . '"');
} else {
header("Content-Disposition: attachment");
}
echo file_get_contents($path);
以下のブラウザで文字化けすることなくダウンロードできることを確認。
- Windows: IE6, IE7, Firefox2, Opera9.?, Safari3
- Linux: Firefox2, Opera9.?
- Mac: Firefox3, Opera9.?, Safari3