
いつもお世話になっております。
アップロードしたファイルから
$_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!!");
?>
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できちんと表示されている気がしますが、どうなんでしょ?
まずは、最初の問題をクリアしてください。
この回答への補足
kotaron さん 早速の回答ありがとうございます。
ご推察の通り、環境は、WinXPです。
さて、ご指摘の>echo "userfile_name is ".$_FILES['userfile']['name'];
ですが、ファイル名は、この時点で、既に化けています。通常のPOSTでの変数引渡しは、問題なく引き継がれます。<input type=file >を$_FILES[]で受け取る場合のみこの問題が起こるようです。ほとほと困っています。
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);
?>
---------- ここまで ------------------------------------------------
No.4
- 回答日時:
間違えましたaddslashes()で\(5C)をクオートしてください
内部構\造.txt にしてあげると幸せになれます
参考URL:http://jp.php.net/manual/ja/function.addslashes. …
No.3
- 回答日時:
stripslashes()関数とか使ってください
日本語環境()だと「\」で表示されますが本当は「\」バックスラッシュの半角と同意であり、文字コードも同じ「5C」です
参考URL:http://jp.php.net/manual/ja/function.stripslashe …
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の方も大丈夫ですよね?
この回答への補足
質問の意図が正しく伝わっていないようです。
アップするファイル名は「端末構造解析.txt」です。
受け側のプログラムで、
echo $_FILES['userfile']['name']; とすると、
「造解析.txt」と表示します。構の字(8D5C)の後ろ
1バイト5Cが原因で、ファイル名前半が飛んでいるようです。圭(8C5C)噂(895C)でも同様の現象が起こります。この字を含まない漢字ファイル名は、なんの問題もありません。
magic_quotes_gpc = Off も stripslashes()も試しましたが、効果がありませんでした。困ってしまいました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- PHP PHPでユーザー情報を入力して簡易ログイン機能をつくってみたのですが 1 2023/05/29 08:51
- PHP 画像が表示出来ません。 1 2023/02/02 16:30
- PHP $filePath = './user_img/' . $file['name'];? 1 2022/12/10 07:29
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
POSTの項目に追加
-
VBA で、スペースを含むファイ...
-
phpからmysqlにデータ保存(テ...
-
Flaskでサーバー立ち上げに関して
-
PHPの質問:フォームから受け取...
-
PHPの初心者です。現在チェック...
-
PHPでURLにジャンプするには?
-
都道府県選択
-
フォームボタンを押すたびに数...
-
laravelを利用してコントロール...
-
複数のセレクトボックスを1つに...
-
フォームの内容をクッキーに保...
-
サブウィンドウのFORM内データ...
-
複数 selectフォームから今回on...
-
【PHP&JavaScript】複数の別ウ...
-
検索時の選択内容を保持する方法
-
cookieでチェックボックスの状...
-
PHPで画像の渡しが上手く行きま...
-
GETやPOSTで値を取り出すとき
-
検索フォームに「道路」と書い...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA で、スペースを含むファイ...
-
php+mysqlでの重複チェックにつ...
-
$_SESSIONに渡した後はそのまま...
-
重複を防ぐ記述について教えて...
-
PHP MySql 画像を取得
-
アップロードファイル名の文字化け
-
アップロードしたファイルの絶...
-
Flaskでサーバー立ち上げに関して
-
Fortranでのファイル名操作につ...
-
PHP で動的ファイル出力
-
phpで変数を使ってcopyできない
-
PHPからHTMLへの変数の受け...
-
PHPのエラー対処法を教えてくだ...
-
name属性が全角の場合・・・
-
openCVのトラックバーについて
-
インスタンスとコンストラクタ
-
多次元配列から作った表の重複...
-
サブフォルダ内の全てのテキス...
-
ファイル名を変更してアップロ...
-
テキストボックスの値を取得したい
おすすめ情報