• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:class.upload.phpでファイル文字化け)

class.upload.phpでファイル文字化け

このQ&Aのポイント
  • class.upload.phpを使用して画像アップロード機能を作成している際に、アップされた画像ファイル名に日本語またはスペースが含まれる場合に文字化けが起こる。
  • mb_convert_encodingを使って$_FILES["img"]["name"]をSJISに変換しても、正しいファイル名にならない。
  • 解決策が分からず、同じ現象で苦戦している方に教えて欲しい。

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

  • ベストアンサー
回答No.1

Windowsでは、ファイルシステム上の日本語名称は、Shift_JISで書かれていますので、アップロードされた画像の名前に対して、 <?php $value = mb_convert_encoding($value, 'UTF-8', 'Shift_JIS'); ?> でいいと思いますが、OSXなんかは、UTF-8。UbuntuとかCentOSなんかの最近のLinux系のOSもUTF-8。 古いLinux系だとEUC-JPだったりするし、何かもっと未知のOSが別の文字コードを使っている可能性があります。 どの様なクライアントから画像がアップロードをされるかはわからないので、基本的に日本語は扱わない方向性のほうが良いとおもいますが、いかがでしょう。 よくある画像のアップローダなんかだと、端からアップロードされたときのファイル名は無視して、Webアプリケーション側で管理しているユニークな文字列で管理していたりします。

yama-maron
質問者

お礼

hogehoge78さん ご回答ありがとうございます。 仰る通りです。 サーバ(CentOS)側の文字コードはUTF-8となっているので、自分のローカルPC(Windows)にあるファイルをアップするとSJISからUTF-8に変わるわけですので文字化けしてしまう訳ですよね。。 なのですが、ご教授いただいた、 mb_convert_encoding($value, 'UTF-8', 'Shift_JIS'); で試してみたのですが、上手くいきませんでした。 class.upload.phpで $handle->file_src_name_bodyに対してmb_convert_encoding、 アップロード関数を実行する前に $_FILES["img"]["name"]に対して同じくmb_convert_encoding を試してみたのですが、どちらもアップされたファイル名に変化はありませんでした。 上手くいかなかったことは残念ですが、 >どの様なクライアントから画像がアップロードをされるかはわからない・・・ というご意見に私も賛同ので、ファイル名に日本語がきたらエラーにする仕様にしました。 今までどのような仕様にするか色々と悩んでいたので、非常に助かっております。 ローカルに日本語で画像ファイルを保存しているクライアントも多少なりとはいるとおもいますが、それほど不便になるとも思えませんしね。 >Webアプリケーション側で管理しているユニークな文字列で管理 そのような方法もあったのですね。”なるほど”といった感じです。これなら、日本語がきてもスペースがきても?対応できそうですね。今回はこちらの仕様にはしませんが、勉強になりました。 迅速かつご丁寧な対応をありがとうございました。