いつもお世話になっております。
アップロードしたファイルから
$_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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA で、スペースを含むファイ...
-
PHPからHTMLへの変数の受け...
-
サブフォルダ内の全てのテキス...
-
phpで変数を使ってcopyできない
-
ファイル名を変更してアップロ...
-
MySQL,PHPのリロードによる二重...
-
if文のもっとスマートな書き方
-
セッションにIDを振って値を代入
-
ドロップダウンで送信先を変更...
-
laravelを利用してコントロール...
-
チェックボックスによる検索
-
フォーム送信後の更新ボタンで...
-
POSTデータをフォームに残す方法
-
複数のラジオボタングループを...
-
VBSのIEオブジェクトでフ...
-
<input type="hidden" >で配列...
-
ゼロ除算
-
PHPのエラーの解消法について教...
-
セッションを使わずに遷移先画...
-
GETとPOST以外のデータの渡し方...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA で、スペースを含むファイ...
-
ファイル名を変更してアップロ...
-
アップロードファイル名の文字化け
-
PHPからHTMLへの変数の受け...
-
プログラミングC++のmapについて
-
phpで変数を使ってcopyできない
-
Flaskでサーバー立ち上げに関して
-
SQLインジェンクション対策法を...
-
POSTの項目に追加
-
パラメータを2個つけたい
-
サブフォルダ内の全てのテキス...
-
フォームで送られてきたメール...
-
PHP FTPサーバへの画像アップロ...
-
連想配列を複数条件で比較して...
-
name属性が全角の場合・・・
-
if function PHP
-
マクロ(VBA)について
-
PDOのprepareでLIKEの部分一致...
-
画像をDBに登録できない
-
テキストボックスの値を取得したい
おすすめ情報