2014-12-09 59 views
-3

我使用下面的代码来通过perl cgi来处理上传文件。我尝试fileparse,但给路径错误。我在这里做错了什么?fileparse error while exec cgi script-perl cgi

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

想必你会弄错路径。可能对当前工作目录做出错误的假设。可能没有权限访问正确的目录。 – Quentin 2014-12-09 12:10:53

+0

我的代码: 使用严格的 使用CGI; 使用CGI ::鲤鱼qw(fatalsToBrowser); 使用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; – 2014-12-09 12:11:59

+0

if($ filename =〜/ ^([$ safe_filename_characters] +)$ /)$ filename = $ 1; } else { die“Filename contains invalid characters”; } – 2014-12-09 12:12:22

回答

2

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

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

是不是在做你认为的事情。也许你没有为这个CGI参数传递一个值。也许你的表单输入名称是错误的。但没有看到你是如何打电话给你的程序的,就不可能再有任何帮助。您的代码

一些更多的评论:

  • use strict use CGI; - 想必这给出了一个语法错误
  • 请使用CGI->new代替new CGI
  • 第二个(以及随后的)参数fileparse()应文件扩展名。 \..*看起来不像是我的文件扩展名
  • 您从$filename中删除所有不安全的文件名字符,然后检查$filename中是否有任何不安全的文件名字符。这真的是你想要的吗?

然后有一个标准的建议,学习CGI在2014年很像学习使用打字机。它当然会起作用,但是人们会认为你有点老式和奇怪:-)