
前提・実現したいこと
os:Windows
phpバージョン:7.0.19
旧phpバージョン:5.6.22
** パッケージにバンドルされているphpなので、phpのバージョン変更は難しいです。**
実現したいことは、phpにてアップロードされたファイルを日本語でも文字化けなくサーバ内の所定のフォルダに保存することです。
発生している問題・エラーメッセージ
phpのバージョンアップに伴い課題が発生しました。
これまでmove_uploaded_file()の引数のファイル名をmb_convert_encoding()でutf8->cp932に変換して日本語ファイル名に対応していました。
php
1 2$file_path_SJIS = mb_convert_encoding($file_path, 'cp932', 'UTF-8'); 3move_uploaded_file( [元ファイル], $file_path_SJIS);
しかし、php7.0で動かしたところ、吐き出されたファイルのファイル名が、
SJISをUTF-8で読み込んだファイル名になってしまいます。
試したこと
mb_convert_encodingを外してみましたが、今度は別の文字化けされたファイルが出力されました。
php.info()で見たmbstringの設定
バージョンアップ前
バージョンアップ後
検証用のサンプルソース
以下のソースで日本語を含むファイル名のファイルをアップロードしたときに、
ファイル名が文字化けしてしまいます。
(検証用に色々混じっていて、雑なコードですみません。。)
php
1<?php 2 header('Content-Type: text/html; charset=utf-8'); 3 $wkpath = __DIR__.'/'; 4 $file_name = $_FILES['file']['name']; 5 $file_tmp = $_FILES['file']['tmp_name']; 6 $Result = ""; 7 $file_name_path = mb_convert_encoding($wkpath.$file_name,'cp932','utf8'); 8 if(move_uploaded_file( $file_tmp,$file_name_path)) 9 { 10 $Result = "【OK】".mb_convert_encoding($file_name_path, 'utf8','cp932'); 11 } 12 else 13 { 14 $Result = "【NG】".mb_convert_encoding($file_name_path, 'utf8','cp932'); 15 } 16 17?> 18 19<html> 20 <head> 21 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 22 </head> 23 <body> 24 <p></p> 25 <form action="" method="post" enctype="multipart/form-data" onsubmit="set()"> 26 <input type="file" name="file" /> 27 <input type="submit" value="アップロード実行" style="position: absolute; left: 320px; top: 8px"/> 28 </form> 29 <?php echo "アップロード結果:" ?> 30 </form> 31 <div> 32 <textarea cols="100" rows="4" style="overflow:scroll;" readonly><?php echo $file_name . "を受け付けました"; ?></textarea> 33 </div> 34 35 <div> 36 <?php echo $Result,"<br />\n"; ?> 37 </div> 38 </body> 39</html>


回答2件
あなたの回答
tips
プレビュー