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にしております。 =================== 以上、よろしくお願い致します。

  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
回答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アプリケーション側で管理しているユニークな文字列で管理 そのような方法もあったのですね。”なるほど”といった感じです。これなら、日本語がきてもスペースがきても?対応できそうですね。今回はこちらの仕様にはしませんが、勉強になりました。 迅速かつご丁寧な対応をありがとうございました。

関連するQ&A

  • PHPファイル文字化けについて

    linux CentOS3(RedHat Enterprise3)を利用しています。 linuxは文字コードがEUCと認識しております。 そこでwindows上にてPHPファイルを作成、文字コードEUCにて保存し、 ffftpにてlinuxサーバにアップロードし、webページを参照してみました。 PHPファイルは以下の通りです。 <?php echo "こんにちは"; ?> 結果、InternetExplorerを利用し閲覧したところ文字化けにて表示されます。 文字コードは「UTF-8」が選択されています。 もちろん、文字コードを「EUC」に変更すると、 出力されてほしい文字列が表示されます。 これをInternetExplorerにて表示したとき、 文字化けしないような設定に変更したいと考えます。 どのような手順を踏めばよろしいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • phpでのファイルアップロード

    ファイルのアップロードについてご質問があります。 宜しくお願いします。 基礎phpという本でファイルをアップロードするサンプルがあり、このスクリプトでアップロードされたファイルを格納する『upload』というディレクトリをサーバに作成し、スクリプトを実行して、実際にファイルがアップロードできているかffftpにて『upload』ディレクトリの中を見てみると、なにも表示されませんでした。しかしブラウザから http://myドメイン/upload/ファイル名 にアクセスすると表示されます。 ですのでアップロードはできているがファイルが見えないという状態になっております。また『upload』ディレクトリの削除などもできなくなってしまいます。 サーバの設定が関係しているのかとも思ったのですが、サーバの設定を変更することはできないので、プログラムがわで何とかできないでしょうか? 大変申し訳ありませんが宜しくお願いいたします。 以下がそのコードです。 【up.html】 <html> <head><title>File Uploader</title></head> <body> <form method="post" enctype="multipart/form-data" action="up.php"> <input type="file" name="upfile"> <input type="submit" value="upload"> </form> </body> </html> 【up.php】 <html> <head><title>File Uploader</title></head> <body> <p> file uploader </p> <?php $updir = "./upload/"; $filename = $_FILES['upfile']['name']; if (move_uploaded_file($_FILES['upfile']['tmp_name'], $updir.$filename) == FALSE){ print("Upload failed..."); print($_FILES['upfile']['error']); }else { print("<b>" . $filename . "</b> uploaded!"); } ?> </body> </html>

    • ベストアンサー
    • PHP
  • ファイルをアップロードすると文字化けしてしまう。

    PHP初心者です。カテゴリで同じような質問を捜したのですが見つからず、質問させて頂きました。よろしくお願い致します。 windowsXPでPHP4.4.4+MYSQL+Apacheを使用しており、PHPの内部コードはEUC-JPで出力はSJISです。 写真のアップロードとコメントをつけたいと思い本を見ながら↓を作成したのですが、 写真(ファイル名)&コメントをブラウザで表示すると文字化けしてしまって困っております。 どうすれば文字化けせずに表示できるようになるか教えて頂ければと存じます。 ※up.php(写真の選択&コメントをする画面です) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> <title>登録</title> </head> <body> <form action="kakuninn.php" name="make1" method="post" enctype="multipart/form-data"> <p> <input name="image1" size="40" type="file"> <input type="image" name="image_up" src="../img/upload.gif" alt="アップロード"> </p> <p>コメント</p> <p> <input name="kome" type="text" value="" maxlength="50"> </p> <p> <input type="submit" name="Submit" value="送信"> </p> </form> </body> </html> ※kakuninn.php(ファイル名とコメントを確認する画面です。) <?php print("文字コード(画像):".mb_convert_encoding($image1,"auto")."<br>"); print("文字コード(コメント):".mb_convert_encoding($kome,"auto")."<br>"); print("画像:".$image1."<br>"); print("コメント:".$kome."<br>"); ?> 例えば、写真欄に「写真1.jpg」、コメント欄に「コメント」として、送信ボタンを押すと↓の結果となります。 文字コード(画像):C:\WINDOWS\php24A.tmp 文字コード(コメント):?R?????g 画像:C:\WINDOWS\php24A.tmp コメント:?R?????g

    • 締切済み
    • PHP
  • PHP+smartyで文字化け

    PHP+smartyでサイトを作成し始めました。(以下URL) http://babyitem.info/ PHPファイル、テンプレート共に、文字コードはEUCで作成しています。 サーバーは、ロリポップをレンタルしています。 index.phpは以下の通りです。 ----------------------------------------------------------- <?php $contents_title="ベビーアイテム.info"; $tpl->assign("contents_title",$contents_title); $tpl->display("babyitem.tpl"); ?> ----------------------------------------------------------- babyitem.tpl(上記サイト左の部分)は以下の通りです。 ----------------------------------------------------------- <div id="left"> <div class="left_top">{$contents_title}</div> <div class="left_bottom"></div> </div> ----------------------------------------------------------- テンプレートファイルの{$contents_title}に 「ベビーアイテム.info」という文字をassignしているのですが、 文字化けして表示されてしまいます。 ちなみに、「babyitem.info」という文字をassignすると、 そのまま、「babyitem.info」と表示されます。 正しく表示する為には、どの辺りの設定を確認すれば良いでしょうか? ご教授くださいませ。

    • 締切済み
    • PHP
  • upload_max_filesizeを超えるファイルのアップロード

    phpにて動画ファイルをアップロードするプログラムを作成しています。 うまくアップロードされないため調べましたところ、upload_max_filesizeを超えたサイズだったためでした。 現状、2Mになってます。 レンタルサーバーなので、php.iniは触れないので、upload_max_filesizeを変えずに対応したいのですが、どうにか方法はないものでしょうか?

    • 締切済み
    • PHP
  • linuxでphpファイルが文字化け

    はじめまして。 linux(FedoraCore3)にphpファイルをアップして会社内のWebツールを提供しています。今度、Webツールの改修の必要があるのですが、linux上のphpファイルが文字化けして編集することができません。 linux上でviエディタで開いた場合も、FFFTPでWindowsマシンに落としてからテキストエディタで開いた場合も、文字化けしています。 (FFFTPはアスキー転送/バイナリ転送の両方を試してみました。) (テキストエディタは秀丸とEmEditorでEUC/UTF-8/jisなど全文字コードを試してみました。) 文字化けは日本語の部分に限らず、全体的に化けています。 また、EmEditorで開くと「ファイルに含まれていたNull文字(00H)は、スペースに変換して開きます。」とメッセージが出ます。 linux上ではWebツールとして正常に動作するのに、エディタで開いたときだけ化けてしまうのは何故でしょうか? ファイル内の「00H」の文字がNull扱いされているのが原因なのかとは思うのですが具体的にどう対処すれば良いのかわかりません。 作成した前任者は退社しており、手詰まりになってしまいました。 推測の域でも結構ですので、何かアドバイスいただけますでしょうか。 乱文で申し訳ありませんがよろしくお願いいたします。

  • UPLOADで

    uploadで、MIDIファイルはできますが、 WMA、MP3などはできますか ファイル名が違うとUPできませんでした。

  • cgiでファイルダウンロード時の文字化け

    このcgiはファイルをアップロードとダウンロードすることが出来るcgiです。 日本語名のついたファイルをアップロードするときは文字化けもなく保存できるのですが、そのファイルをダウンロードすると日本語が文字化けしてダウンロードされてしまいます。 アップロードした時点で Fileというフォルダに格納されるのですが、そのときはまだ格納されたファイルは文字化けはしていません。cgi上に表示されているファイル名も文字化けはしていません。 ダウンロードするファイルを選択した時点で文字化けしたアドレスがIEの下に表示されます。そして、その文字化けの文字のままファイル名となってダウンロードされてきます。 yahooのブリーフケースに日本語のファイル名をアップした時のURLの文字化けに似ているような気がします。 でもyahooの場合はダウンロードしてもファイル名は文字化けしていないのです。 ご指導よろしくお願いいたします。

  • ファイルのアップロードで文字化けします

    ファイルのアップロードを行うと特定文字以降の名前が消えてしまいます。 (予、表など2バイトコードに5Cが含まれる文字) コードは下のように書いています。 <form enctype="multipart/form-data" action="upload_fnc.php" method="POST"> <input type="hidden" name="MAX_FILE_SIZE" value="30000"> <input name="userfile" type="file"> <input type="submit" value="Send File"> </form> サーバの動作環境はLinux(FedoraCore3)、Apache2.0.52、PHP4.3.10です。 クライアント側はほとんどがWindows(2000、XP)です。 どのようにして対処すればよいか分からなく困っています。 どなたかお分かりの方がいらしたら教えてください。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • class.upload.phpの戻り値(返り値)の画像サイズ容量情報について

    class.upload.phpである大きさ以上の画像は リサイズを掛けて縮小する設定にしていますが 戻り値(返り値)のサイズ(容量)情報はリサイズする前の容量なので リサイズ後のサイズ(容量)情報を知るにはどうすればよいでしょうか。 宜しくお願いします。

    • 締切済み
    • PHP

専門家に質問してみよう