ご無沙汰しております。管理人です。
GW前はプチ年末進行なので厳しい日々が続いておりまして、色々手が打てずにおります。Wordpress MUにブログを追加するwpmu_create_blog関数を見つけたので、GW前に会員登録システムを自動化するつもりだったのですが、1日の余裕も取れませんでした。デザインの更新やら記事やら色々やりたいことはあるのですが……。
ところで先日、取引先とのファイルやりとり用にPHPでちょっとしたアップローダを作成したのですが、その際に引っかかった日本語ファイルの扱いについて書きます。
日本語のファイル名を一覧に表示するときは、普通そのWebページのエンコードに合わせてEUCかUTF-8にします。しかし、そのままサーバ側のフォルダやブラウザのファイルダイアログに渡すと、文字化けして「ファイルが存在しないエラー」になってしまうのです。
結論から言うとサーバやブラウザに渡すときはSJIS(シフトJIS)に変換しなければならないようです。
●ファイルをアップロードするとき
フォームから渡されたファイル名をmb_convert_encoding関数でSJISに変換してから、move_uploader_file関数で保存用フォルダに移動します。
//サーバに保存するとき $tmp_name = $_FILES["upfm_upfile"]["tmp_name"][$key]; $filename = $dirpath."/". mb_convert_encoding($_FILES["upfm_upfile"]["name"][$key], "SJIS", "auto"); move_uploaded_file($tmp_name, $filename);
それをファイル一覧に表示するときはEUC(ページがEUCの場合)に変換します。でもfilesize関数でファイルサイズを調べるときはSJISのほうの名前を使う。面倒。
//ファイル一覧を表示するとき
while (false !== ($sfile = readdir($hprojectdir))){
$efile = mb_convert_encoding($sfile, "EUC-JP", "SJIS");
if ($efile != "." && $efile != "..") {
echo "<tr><td width='300'>"
."<a href='download.php?fname=".base64_encode($efile)."'>"
.$efile."</a></td>";
//ファイルサイズ表示
$content_length = filesize($dirpath."/".$sfile)
//……後略……;
サーバに渡すときにEUCのままでダメなのはちょっと納得がいかないのですが、そうしないとFFFTPで覗いたときに文字化けしました(これは環境によって違うかもしれません)。
●ファイルをダウンロードするとき
ダウンロードするときにSJISに変換しないといけないのは、ブラウザ依存の話です。「Content-Disposition IE」でググるとすぐに情報が見つかります。本来Webページのエンコードに合わせたファイル名を指定するのが正しいルールなのですが、いくつかのブラウザのファイル保存ダイアログがSJIS決め打ちになっているので、変換してやらないといけないのです。IEがやりだまに上がっていますが、ChromeとSafariも一緒でした。Firefoxだけが違います(違うというかFFだけが正しい)。
//ダウンロードするとき
$path_file1 = $dirpath."/".base64_decode($_REQUEST["fname"]);
$path_file = mb_convert_encoding($path_file1, "SJIS", "auto");
header("Content-Type: application/octet-stream");
//FireFoxのみ処理を変える
//注IEとChromeではファイル名をSJISに変換しないといけない
//Firefoxはページのエンコードに合わせる
if(strpos($agent, "Firefox") !== false){
header("Content-Disposition: attachment; filename=\"".basename($path_file1)."\"");
} else {
header("Content-Disposition: attachment; filename=\"".basename($path_file)."\"");
}
まー、日本語は面倒ですね。
話は変わりますが、最近仕事の気休めにタワーディフェンスをたしなんでおります。設定したら見てるだけ~で、勝手に銃撃戦がバンバン進むところが楽でいいですね。プログラムは意外と簡単そうなので、いずれクローンを作ってみたいですねぇ……余裕ができたら。
- Newer: [告知]リニューアル中です
- Older: [PHP]Firefoxのブラウザキャッシュ
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://i-libro.net/wpmu/blog/archives/359/trackback
- Listed below are links to weblogs that reference
- [PHP]アップローダと文字化け from わくわくプログラミング自習室 Blogs
