• ベストアンサー

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です。

質問者が選んだベストアンサー

  • ベストアンサー
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.1

basenameでの解析はOS/ファイル仕様に左右されます。 windows以外のOSで使用すればWindowsの規則で書かれたファイル名はうまく解析できないでしょう。 これは basename使用前に fileparse_set_fstype( ファイル仕様 ); を呼んでおく事で動作しているOSによらず目的のファイル仕様を解析できます。 basename fileparse_set_fstype で検索すると詳しい解説がみつかるかも。

bakusui
質問者

お礼

なるほど、ではファイル名はあらかじめ決めておく方がいいのですね。

その他の回答 (1)

  • rafysta
  • ベストアンサー率45% (24/53)
回答No.2

File::Basenameは、perlが動作しているOSのパス名に合わせて解析しているために、OSの種類を指定する必要があります。basename()を使用する前に fileparse_set_fstype("MSWin32"); を指定してやれば、期待した動きをしてくれると思いますよ。