Home > PHP | サーバ管理 > [PHP]アップローダと文字化け

[PHP]アップローダと文字化け

ご無沙汰しております。管理人です。
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)."\"");
}

まー、日本語は面倒ですね。

 

話は変わりますが、最近仕事の気休めにタワーディフェンスをたしなんでおります。設定したら見てるだけ~で、勝手に銃撃戦がバンバン進むところが楽でいいですね。プログラムは意外と簡単そうなので、いずれクローンを作ってみたいですねぇ……余裕ができたら。

Comments:0

Comment Form
Remember personal info

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

Home > PHP | サーバ管理 > [PHP]アップローダと文字化け

Amazonリンク

Return to page top