exec cgi script- perl cgi时出现fileparse错误

时间:2014-12-09 12:05:02

标签: perl cgi

我使用以下代码通过perl cgi处理上传文件。我尝试fileparse但是给出了路径错误。我在这里做错了什么?

exec因以下错误而失败。

fileparse(): need a valid pathname at ./testupload.cgi line 15

任何输入?

来源:

 use strict use CGI;
 use CGI::Carp qw ( fatalsToBrowser );
 use File::Basename;
 $CGI::POST_MAX = 1024 * 5000;
 my $safe_filename_characters = "a-zA-Z0-9_.-";
 my $upload_dir = "/home/test/Desktop/uploads";
 my $query = new CGI;
 my $filename = $query->param("textfile");
 my ($name, $path, $extension) = fileparse($filename, '\..*');
 $filename = $name.$extension; $filename =~ tr/ /_/;
 $filename =~ s/[^$safe_filename_characters]//g; 
 if ($filename =~ /^([$safe_filename_characters]+)$/)
 { $filename = $1; }
 else
 { die "Filename contains invalid characters"; }

1 个答案:

答案 0 :(得分:2)

查看source for File::Basename,如果您将未定义的值作为fileparse()的第一个参数传递,则您似乎只会get that error message。所以它看起来肯定是$filename未定义的。这意味着你的行:

my $filename = $query->param("textfile");

没有做你认为的事情。也许您没有为该CGI参数传递值。也许你的表单输入错误的名称。但是如果没有看到你如何称呼你的程序,就不可能再有任何帮助了。

关于您的代码的更多评论:

  • use strict use CGI; - 大概会出现语法错误
  • 请使用CGI->new代替new CGI
  • fileparse()的第二个(及后续)参数应该是文件扩展名。 \..*看起来不像我的文件扩展名
  • 您从$filename中删除所有不安全的文件名字符,然后检查$filename中是否存在任何不安全的文件名字符。这真的是你的意图吗?

然后有标准的建议,即2014年学习CGI就像学习使用打字机一样。当然,它会起作用,但人们会认为你有点过时和奇怪: - )