• ベストアンサー

全角ファイル名をアップロードすると文字化け

複数のファイルをアップロードできるスクリプトを作成しています。 サーバはWindows、PHPのバージョンは5です。 利用者の要望で日本語のファイル名もアップロードできるようにしたいのですが、文字化けします。 http://okwave.jp/qa1724442.html を参考にし、下記のスクリプトを move_uploaded_file($att_tmp, mb_convert_encoding($att_name,"UTF-8")); と、変更もしてみましたが、うまくいきません。 $valueは文字化けせずに表示されていますが、サーバ上ではファイル名が「逋コ陦ィ謇ソ隱阪す…」という風に化けてしまいます。 対策を教えて頂けませんでしょうか。 よろしくお願いします。 if (isset($_POST["submit"])){ //添付ファイル用変数 foreach($_FILES["att"]["error"] as $key => $error_a){ if($error_a == UPLOAD_ERR_OK){ $att_na = $_FILES["att"]["name"][$key]; $att_tmp = $_FILES["att"]["tmp_name"][$key]; $att_type = $_FILES["att"]["type"][$key]; $att_size = $_FILES["att"]["size"][$key]; if (strlen($att_na)>0){ //ファイル移動 list($att_nam,$k) = explode(".",$att_na); $ymdhis = date("YmdHis"); $att_name = "{$att_nam}-{$ymdhis}.{$k}"; move_uploaded_file($att_tmp, "file/$att_name"); $att_name_ar[] = $att_name; foreach($att_name_ar as $value){ echo $value."<br>"; } } } }

質問者が選んだベストアンサー

  • ベストアンサー
  • dell_OK
  • ベストアンサー率13% (766/5720)
回答No.2

アップロードする目的だけでは不可能のようです。 アップロードしたファイルを、 またユーザーがダウンロードする事があるのでしたら、 アップロードする元の2バイト文字を含むファイル名を、 MySQLなどのデータベースに保存しておいて、 実際のアップロードファイルは半角文字に連番などを付けて管理し、 ダウンロード時にデータベースから参照して、 保存名の初期値に元の名前を表示するようにされたらいいと思います。 それぞれのやり方はわかっていたのですが、 他が忙しくなったので完成せずじまいになっているので、 サンプルコードを提供できなくてすみません。

quakeandb
質問者

お礼

回答ありがとうございます! MySQLを使用してデータを保存していたので、項目を1つ追加してリンク用のファイル名と表示用のファイル名をそれぞれ別に保存するようにしてうまくいきました。 変更後のスクリプトは自分で対処できましたので大丈夫です。 とても助かりました!アドバイス本当にありがとうございました。

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

結論をいいます。 全角文字を使う限り文字化けしない完璧な対応方法はありません。 全角文字を使うことはさけてください。 場合によって英数字と許された記号以外の文字が送られてきた場合は 自動でzipアーカイブしてしまうのも手かもしれませんね

quakeandb
質問者

お礼

回答ありがとうございます! 全角文字でアップロードすることはやはり難しいのですね。 今回はNo2さんの方法で解決しましたが、zipアーカイブする方法も今後の選択肢の1つとして覚えておきます。