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 回答