我使用以下代码通过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"; }
答案 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就像学习使用打字机一样。当然,它会起作用,但人们会认为你有点过时和奇怪: - )