※ ChatGPTを利用し、要約された質問です(原文:class.upload.phpでファイル文字化け)
class.upload.phpでファイル文字化け
このQ&Aのポイント
class.upload.phpを使用して画像アップロード機能を作成している際に、アップされた画像ファイル名に日本語またはスペースが含まれる場合に文字化けが起こる。
mb_convert_encodingを使って$_FILES["img"]["name"]をSJISに変換しても、正しいファイル名にならない。
解決策が分からず、同じ現象で苦戦している方に教えて欲しい。
class.upload.phpでファイル文字化け
class.upload.phpを使って画像アップロード機能を作成しました。
テンプレートのフォーム<input type="file">でアップしたい画像を選択して、"アップロード"ボタンを押すと、class.upload.phpが動いて指定したディレクトリに画像がアップされるところまでできました。
また、アップした画像をテンプレート内に表示したいため、上記の処理と同時にDBに画像のファイル名だけをinsertするプログラムも自作しました。
上記2つの機能で画像のアップロード・閲覧をしようとしているのですが、class.upload.phpを使用してアップされた画像ファイル名に日本語またはスペースが含まれる場合、日本語の部分とスペース部分だけが文字化け!?を起こしてしまいます。
例としては、ローカルにある画像名が
「kousin - コピー.gif」
の場合、アップされたファイル名は
「kousin___.gif」
となってしまいます。
色々と調べたところ、文字コードが原因の可能性があることが分かったのですが、class.upload.phpの
$handle->パラメータ
でアップするファイルの文字コードを変更できる機能があるか探したところ、それらしき機能が見つかりませんでした。
そこで、画像のアップ処理をする前に、mb_convert_encodingを使って$_FILES["img"]["name"]に対してSJISにするようにしてみたのですが、アップされたファイル名に多少の変化はあったものの、正しいファイル名になってくれません。
アップする画像名に日本語やスペースが入っている場合、どのように対応したら良いのか分かりませんので、解決策がお分かりの方、同じ現象で苦戦している方いらっしゃいましたら、ご教授・ご報告の程お願い致します。
(※解決方法は、class.upload.phpを使った方法、オリジナルのプログラムをかませる方法どちらでも構いません)
下記、開発している環境などです。
===================
サーバ:CentOS5.4
使用言語:XHTML、CSS、JavaScript、PHP5、MySQL
上記の言語、それぞれ別ファイルで作成しており、どれも文字コードはUTF-8N、改行コードはHTMLはCRLF、それ以外はLFにしております。
===================
以上、よろしくお願い致します。
お礼
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アプリケーション側で管理しているユニークな文字列で管理 そのような方法もあったのですね。”なるほど”といった感じです。これなら、日本語がきてもスペースがきても?対応できそうですね。今回はこちらの仕様にはしませんが、勉強になりました。 迅速かつご丁寧な対応をありがとうございました。