- ベストアンサー
CGI のモジュールをつかってファイルのアップロード
use CGI qw(:standard); use File::Basename; $upimg1_pm = param('upimg1'); while (read($upimg1_pm, $buffer, 2048)) { $file .= $buffer; } $FileName = basename($upimg1_pm, ""); open UP,"> $img_dir/$FileName"; binmode UP; print UP $file; close UP; 上のようにファイルのアップロードのプログラムを書いたのですが、実際アップロードしたら C:\Documents and Settings\~top.gif のようにWindowsのローカルパスがそのままファイル名としてアップロードされてしまいました。 basenameはファイル名をとるモジュールときいていたのですがなぜこうなるのでしょうか? おそれいりますがご教授おねがいします。 もしかしてFile::Basename;のモジュールがないとか・・・ Perl5です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
basenameでの解析はOS/ファイル仕様に左右されます。 windows以外のOSで使用すればWindowsの規則で書かれたファイル名はうまく解析できないでしょう。 これは basename使用前に fileparse_set_fstype( ファイル仕様 ); を呼んでおく事で動作しているOSによらず目的のファイル仕様を解析できます。 basename fileparse_set_fstype で検索すると詳しい解説がみつかるかも。
その他の回答 (1)
- rafysta
- ベストアンサー率45% (24/53)
File::Basenameは、perlが動作しているOSのパス名に合わせて解析しているために、OSの種類を指定する必要があります。basename()を使用する前に fileparse_set_fstype("MSWin32"); を指定してやれば、期待した動きをしてくれると思いますよ。
お礼
なるほど、ではファイル名はあらかじめ決めておく方がいいのですね。