我的perl脚本遇到了一个问题,就是它没有通过。作为一个初学者,如果有人能为我解释一下,我会很感激。正如Lincoln所提到的,param()使用起来很简单,但实际上它很复杂。我阅读了cgi文档和其他示例,但不明白为什么这个不起作用,我从其他文档中复制了这些示例进行测试
我相信我的apache、perl和CGI.pm安装正确,并且与其他示例一起运行良好,但与本例不同
非常感谢!
====================================================
1 #!/usr/bin/perl -wT
3 use strict;
4 use CGI qw(:standard);
6 my $q = CGI->new;
8 my $filename = $q->param("name");
#print $filename, "n";
10 my $contenttype = $q->uploadInfo($filename)->{'Content-Type'};
12 print header;
13 print start_html;
14 print "Type is $contenttype<P>";
15 print end_html;
====================================================-------------错误消息--------------------------------------------
error] [client 127.0.0.1] Use of uninitialized value in hash element at (eval 3) line 3.
[error] [client 127.0.0.1] Can't use an undefined value as a HASH reference at /usr/lib/cgi-bin/Steve/Listing4-1-upload-file.cgi line 10.
[error] [client 127.0.0.1] malformed header from script. Bad header=tomato: Listing4-1-upload-file.cgi
在脚本的第一行中,您启用了perl的Taint模式(-T
开关)。这很好。但它会导致脚本之外的任何内容——包括CGI脚本的参数——被污染。受污染的内容不能用于对某些系统调用的调用——请参阅manperlsec。在使用此内容之前,您必须取消对数据的标记。
这可能是造成这里问题的原因,因为变量$filename
被污染了,所以不会保存上传的内容,因此$q->uploadInfo( $filename )
不会返回hashref。我建议至少两个改变:
- 在获得$filename后,使用正则表达式对其内容进行取消标记
- 调用uploadInfo后,请验证操作是否成功,然后再继续
我希望这能有所帮助。
如果您没有检查是否确实有文件发布到脚本中,您将收到一个错误。如果您希望使用html来生成表单提交,这意味着您需要一个表单元素,如
<input type="file" name="name" />
请尝试这个例子。额外的if
语句检查文件以防止引用无效的上载。我们还提供了一个简单的用于测试上传案例。
my $filename = $q->param("name");
my $contenttype = '';
$contenttype = $q->uploadInfo($filename)->{'Content-Type'} if $filename;
print header;
print start_html;
print '
<FORM ENCTYPE="multipart/form-data" ACTION="/Listing4-1-upload-file.cgi" METHOD="POST">
Please select a file to upload: <BR/>
<INPUT TYPE="FILE" NAME="name" />
<INPUT TYPE="submit">
</FORM>';
print "<p>file: $filename </p>" if $filename;
print "<p>Content-Type: $contenttype </p>" if $contenttype;
print end_html;