電子書籍の厳選無料作品が豊富!

いつもお世話になっております。

アップロードしたファイルから
$_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!!");

?>

A 回答 (5件)

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できちんと表示されている気がしますが、どうなんでしょ?
まずは、最初の問題をクリアしてください。

この回答への補足

kotaron さん 早速の回答ありがとうございます。
ご推察の通り、環境は、WinXPです。

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

補足日時:2005/03/22 08:31
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/04/05 08:32

こんにちは。


バックアップかなにかの用途に使うのでしょうか。外部公開というのであれば、日本語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);
?>
---------- ここまで ------------------------------------------------
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/04/05 08:31

間違えましたaddslashes()で\(5C)をクオートしてください



内部構\造.txt にしてあげると幸せになれます

参考URL:http://jp.php.net/manual/ja/function.addslashes. …
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/04/05 08:32

stripslashes()関数とか使ってください


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

参考URL:http://jp.php.net/manual/ja/function.stripslashe …
    • good
    • 1

前の方の言うように、文字コードを変換してから参照/出力することが肝要。



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の方も大丈夫ですよね?

この回答への補足

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

magic_quotes_gpc = Off も stripslashes()も試しましたが、効果がありませんでした。困ってしまいました。

補足日時:2005/03/22 16:16
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/04/05 08:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!