■default ---■fontsize --70% --80% --100% --120% --140% --- --■scroll_switch

PHP5.6.2からwindowsのファイルネームが読み取れない。解決メモ。

PHP5.6.2からwindowsのファイルネームが読み取れない。解決メモ。
-----------------------
phpをバージョンアップしてみたら、
sjis-winの文字コードで管理されているWindowsのファイルネームで
取得できないものがでてきました。

5c問題というやつ。

申請 表示 予定 ソ
あたり、が入っているファイルネームが認識できないようです。
まったく、ビジネスで結構使う単語よ。
検索すると「PHPのバグ」とか実験してたりとか2~3個出てきます。
でも、私にはさっぱり分からないので、結局解決策がみつかりません。
-------------------
やりたいことは、
HTMLからのFILEのアップロードとダウンロードです。


まずアップロードですが
いままでは
$namae = mb_convert_encoding($saki,"sjis-win","UTF-8"));
で文字コードを変えて
copy ( $moto , $namae );//$motoは$_FILESでゲットしたパス
でOKだったのですが、このままだと、例えば
時間外勤務許可申請書_2014-10-23.pdf
とかをアップロードすると
時間外勤務許可申時間外勤務許可申請書_2014-10-23.pdf
という名前になってしまいます。
なぜか申のところまでが繰り返された文字列になります。
おもしろスペック。
これは簡単に直りました。
$namae = addslashes(mb_convert_encoding($saki,"sjis-win","UTF-8"));
addslashes();
エスケープ?してやればよいです。
---------------------------------------------
ところが、問題はここからで、ダウンロードの方です。
エクスプローラーにはちゃんと
時間外勤務許可申請書_2014-10-23.pdf
で登録されています。

いままでは
$path_file = mb_convert_encoding($path_file, "sjis-win", "UTF-8") ;
//もとの$path_fileはsqlとかに登録したりしているUTF-8の文字列
の、$path_file、でFILE検査とかできてたのですが、これができなくなりました。
filesize();
file_exists();
fopen();
readdir();
あたりの関数で5cの入っている文字列を捜すことができません。
これはお手上げです。

でも、いろいろためしたら、なぜか
copy ();だけ使える事が分かりました。
なので、まず
$path_file = addslashes(mb_convert_encoding($path_file, "sjis-win", "UTF-8") );
で、エスケープ付きのsjis-winの文字コードに変換して
$clone_file = hash("md2", $path_file, false).".tmp";//currentフォルダにファイルを一時的に作る
で適当なファイル名を作ります。
ハッシュってのがいまいちよく分かりませんが、なんかユニークっぽい文字になるのでそれで文字列を作りました。
それで
copy($path_file ,$clone_file);
で、ファイルコピー。実行しているPHPファイルのカレントディレクトリに一時ファイルができます。
そのあと
$content_length = filesize($clone_file);
file_exists($clone_file);
fopen();
とかで、ファイルが存在するかどうか確認して、
header("Content-Disposition: attachment; filename*=UTF-8''".rawurlencode($dl_name));
//$dl_nameはダウンロードのときに付けたいファイル名(ここはsjisでも大丈夫)
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");
header("Content-Length: ".$content_length);
readfile($clone_file);
unlink($clone_file);//ダウンロードが終わったら消す
とやればOKでした。

でも、これはピンポイントでファイルが分かっている時にだけにしか使えないので、
ファイルの検索などは他の方法を使わないといけないでしょう。
スポンサーサイト
ブログ内検索ワード
マジック / フラリッシュ / デザイン / ~のコツ / プログラム関連 /