• ベストアンサー

アップロードファイル名の文字化け

いつもお世話になっております。 アップロードしたファイルから $_FILES['userfile']['name'];で、アップしたファイル名を取得しようとするときにファイル名に 特定(後半1バイトが'5C')の漢字を含むとPHPが、'\'と誤認して該当の文字から前を消して表示してきます。 例えば、「内部構造.txt」は、「造.txt」に化けます。move_uploaded_file関数で、アップしたファイルをどこかに保存しようにも、ファイル名が正しく指定できません。 どなたか、対策方法をご教授頂けませんでしょうか? よろしくお願いいたします。 <? mb_internal_encoding("EUC"); echo "userfile_name is ".$_FILES['userfile']['name']; echo "<br>"; echo "userfile_type is ".$_FILES['userfile']['type']; echo "<br>"; echo "MAX_FILE_SIZE is ".$_POST["MAX_FILE_SIZE"]; echo "<br>"; echo "userfile_tmp_name is ".$_FILES['userfile']['tmp_name']; echo "<br>"; echo "userfile_error is ".$_FILES['userfile']['error']; echo "<br>"; echo "userfile_size is ".$_FILES['userfile']['size']; echo "<br>"; $dir="c:/work/"; if (move_uploaded_file($_FILES['userfile']['tmp_name'], $dir.$_FILES['userfile']['name'])) { print "File is valid, and was successfully uploaded. "; } else print("UPLOAD ERROR!!"); ?>

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

  • ベストアンサー
  • kotaron
  • ベストアンサー率61% (8/13)
回答No.1

Unix系のユーザーかとおもったら、 >$dir="c:/work/"; を見ると、Windowsユーザーですね。 全角文字を使ってファイルを保存したいのなら、 move_uploaded_fileに渡すファイル名をSJISに変換してあげましょう。 mb_convert_encoding($_FILES['userfile']['name'],'SJIS')、みたいに。 ファイル処理は、OSの規則に沿ってください。 \(5C)の問題は、PHPのバージョンにもよりますが、 >echo "userfile_name is ".$_FILES['userfile']['name']; これで、何が表示されていますか? EUCできちんと表示されている気がしますが、どうなんでしょ? まずは、最初の問題をクリアしてください。

puwsan
質問者

お礼

アドバイス大変参考になりました。 ありがとうございました。

puwsan
質問者

補足

kotaron さん 早速の回答ありがとうございます。 ご推察の通り、環境は、WinXPです。 さて、ご指摘の>echo "userfile_name is ".$_FILES['userfile']['name']; ですが、ファイル名は、この時点で、既に化けています。通常のPOSTでの変数引渡しは、問題なく引き継がれます。<input type=file >を$_FILES[]で受け取る場合のみこの問題が起こるようです。ほとほと困っています。

その他の回答 (4)

回答No.5

こんにちは。 バックアップかなにかの用途に使うのでしょうか。外部公開というのであれば、日本語OKにしてしまうとクラッキングもされやすいので、気をつけてください。 で、本題に。環境によって違うかもしれませんね。私の場合もXPなのですが、日本語ファイルをアップするとプログラム中では、正常に扱えるのですが、mb_convert_encoding関数で保存すると日本語の部分が半角カタカナになってしまいました・・・ お使いのWebサーバはApacheでしょうか。ApacheでもApache2とか・・・。 PHPも5ではないでしょうか。 なんか話しをみてると、PHPに渡される前に既にファイル名がおかしくなっているような気がします。 以下で実験してみてください。 ----------- enc.php 中身 -------------------------------------------- <Form Action="./enc.php" method="POST" enctype="multipart/form-data"> <input type="file" name="userfile"> <input type="submit" value="send"> </Form> <? print_r($_FILES); ?> ---------- ここまで ------------------------------------------------

puwsan
質問者

お礼

アドバイス大変参考になりました。 ありがとうございました。

  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.4

間違えましたaddslashes()で\(5C)をクオートしてください 内部構\造.txt にしてあげると幸せになれます

参考URL:
http://jp.php.net/manual/ja/function.addslashes.php
puwsan
質問者

お礼

アドバイス大変参考になりました。 ありがとうございました。

  • inu2
  • ベストアンサー率33% (1229/3720)
回答No.3

stripslashes()関数とか使ってください 日本語環境()だと「\」で表示されますが本当は「\」バックスラッシュの半角と同意であり、文字コードも同じ「5C」です

参考URL:
http://jp.php.net/manual/ja/function.stripslashes.php
  • randman
  • ベストアンサー率51% (17/33)
回答No.2

前の方の言うように、文字コードを変換してから参照/出力することが肝要。 mb_internal_encoding("EUC-JP"); mb_detect_order("ASCII,JIS,UTF-8,EUC-JP,SJIS"); $_FILES['userfile']['name']=mb_convert_encoding($_FILES['userfile']['name'],"EUC-JP",mb_detect_encoding($_FILES['userfile']['name'])); ※$_FILESの値を直接変更するのは避けた方がいいかも。 で、どう? あと、PHPファイル自体の文字コードと、<?php~?>をきちんとしたHTML(METAタグで文字コードが指定されたHTML)で囲んでいることを確認してください。php.iniの方も大丈夫ですよね?

puwsan
質問者

お礼

アドバイス大変参考になりました。 ありがとうございました。

puwsan
質問者

補足

質問の意図が正しく伝わっていないようです。 アップするファイル名は「端末構造解析.txt」です。 受け側のプログラムで、 echo $_FILES['userfile']['name']; とすると、 「造解析.txt」と表示します。構の字(8D5C)の後ろ 1バイト5Cが原因で、ファイル名前半が飛んでいるようです。圭(8C5C)噂(895C)でも同様の現象が起こります。この字を含まない漢字ファイル名は、なんの問題もありません。 magic_quotes_gpc = Off も stripslashes()も試しましたが、効果がありませんでした。困ってしまいました。

関連するQ&A