1

私は perl を使用してファイルをサーバーにアップロードし、それを解析して情報を取得しています。ページは cgi スクリプトであり、perl モジュールを使用しています

use File::Basename;

私のサーバー側のコードは次のとおりです。

my $path = $cgi->param('filename');
my $filename = basename($path);
if ($filename) {
  if ($filename =~ /.csv/i) {do nothing;}
  else {
    $error = 'please upload a csv file';
    push @error, $error;
  }
}

コードは Chrome、Safari、Firefox で正常に動作しますが、IE8 でテストすると、すべてを試しました。ファイル名が完全パス名に変わります。たとえば、C:/meetup/sf/perl.csv が完全なパスです。CSF ではファイル名は perl.csv として表示されますが、IE8 では C:/meetup/sf/perl.csv として表示されます。

すべてのブラウザでファイル名が正しく表示されるように、ファイル名を取得する正しい方法を見つけるのを手伝ってもらえますか。

ありがとう、
パリック

4

2 に答える 2

1

別の方法は、クロスプラットフォームのパス処理を明示的に行うPath::Classを使用することです。

use Path::Class 'file';
my $filename = file($path)->basename;
于 2012-12-18T03:23:05.343 に答える
0

問題は、UNIX/Windowsのパス区切り文字です。通常の/の代わりに、コンポーネントを分離するためにIE8はおそらくそれを\として渡します。

次のようなことを行うことで、普遍的な解決策を実現で​​きる可能性があります。

    my $path = $cgi->param('filename');
    # replace all occurences of \ with / chrome/firefox etc won't be affected 
    #because they wont have any \ delimiters
    $path =~ s/\\/\//g;  

    my ($name,$parsed_path,$suffix) = fileparse($path,@suffixlist);
    print "name $name \n"; # this should carry the name of the file eg perl.csv
于 2012-12-18T10:53:25.703 に答える