M.C.P.C.

―むり・くり―プラスコミュニケーション(更新終了)


| トップページ |

2006年7月31日 20:43

CGI.pmのuploadメソッドでファイル名取得したらフルパスからファイル名を取り出す処理を入れる

このエントリーをはてなブックマークに追加 mixiチェック

個人的な覚え書き。

ファイル送信フォームを使用するクライアントが IE だったら、送られてきたファイル名をそのまま使うとキケンだよ。送信元のシステムにおけるフルパスが送信されます

必ず、File::Basename モジュールの fileparse を通すか、正規表現等でファイル名だけを取り出す処理を追加しましょう。

#!C:/Program Files/Xampp/perl/bin/perl.exe
 
use strict; 
use warnings; 
use CGI; 
use File::Basename;
 
my $q = CGI->new; 
 
my $upload_FH = $q->upload('file');
fileparse_set_fstype('MSDOS');
my $filename  = fileparse($upload_FH);
 
print $q->header(
  -type    => 'text/plain',
  -charset => 'utf-8',
);
print q/$q->upload('file') :/,
  "\n\t$upload_FH\n\n";
print q/fileparse($q->upload('file')) :/,
  "\n\t$filename\n";

Win IE 6 からこの CGI に送信すると、以下のようになります。

$q->upload('file') :
	C:\Documents and Settings\CL\デスクトップ\test.lzh
 
fileparse($q->upload('file')) :
	test.lzh


(2007-11.15 16.47追記)

fileparse_set_fstype('MSDOS'); を挿入すべきでした。ソースには追加しておきました。作例はWindowsのActivePerlで動いているのでたまたま問題ないんですけれども、実行環境に依存するのです。

もっと正確にするには、IEのときだけ実行するコードにしましょう。

#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use File::Basename;
my $q = CGI->new();
if ( _checkWinIE() ) {
  fileparse_set_fstype('MSDOS');
}
my $file = q();
if ($q->upload('file') ) {
  $file = fileparse($q->upload('file') );
}
print $q->header( -type => 'text/plain' );
print "$file \n";
 
exit;
 
sub _checkWinIE {
  use HTTP::BrowserDetect;
  my $ua = HTTP::BrowserDetect
    ->new($ENV{'HTTP_USER_AGENT'});
  if ( ( $ua->browser_string() eq 'MSIE')
       && ( $ua->os_string() =~ m/^Win/ ) ) {
    return 1;
  }
  return;
}

投稿 大野 義貴 [Perl] | |

トラックバック(0)

トラックバックURL: http://blog.dtpwiki.jp/MTOS/mt-tb.cgi/1759

コメントする