【发布时间】:2016-06-03 15:12:14
【问题描述】:
之前,我发布了一个我使用了多年的 PERL 文件上传脚本,但它神秘地停止了工作。此后我尝试了另一个脚本(从网站借来 - https://www.sitepoint.com/uploading-files-cgi-perl/),但它也不起作用。我真的需要一个文件上传脚本在我们的网站上工作,所以任何帮助都非常感谢。
当我尝试使用 html 表单上传文件时,它似乎可以正常工作并显示确认屏幕。该文件存在于上传文件夹中,但它是空的。我将存储上传文件的文件夹的权限更改为 777,但这似乎没有帮助。因此,它能够打开文件夹中的文件,但不能写入。
HTML 代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>File Upload</title>
</head>
<body>
<form action="/cgi-bin/upload.cgi" method="post" enctype="multipart/form-data">
<h2 style="margin-left:40px;">Nursing File Upload</h2>
<p style="margin-left:40px;margin-top:40px;font-size:24px;">File to Upload: <input type="file" name="photo" /></p>
<p style="margin-left:40px;font-size:24px;">Password: <input type="password" name="password" /></p>
<p style="margin-left:40px;font-size:24px;"><input type="submit" name="Submit" value="Submit Form" /></p>
</form>
</body>
</html>
PERL 代码
#!/usr/bin/perl -wT
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/httpd/cgi-bin/ge";
my $query = new CGI;
my $filename = $query->param("photo");
my $password = $query->param("password");
if ($password ne "nursing1")
{
print $query->header ( );
print "Password incorrect. Please try again.";
exit;
}
if ( !$filename )
{
print $query->header ( );
print "There was a problem uploading your file.";
exit;
}
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";
}
my $upload_filehandle = $query->upload("photo");
open ( UPLOADFILE, ">$upload_dir/$filename" ) or die "$!";
binmode UPLOADFILE;
while ( <$upload_filehandle> )
{
print UPLOADFILE;
}
close UPLOADFILE;
print $query->header ( );
print "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"DTD/xhtml1-strict.dtd\">";
print "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">";
print "<head>";
print "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />";
print "<title>Thanks!</title>";
print "<style type=\"text/css\">";
print "img {border: none;}";
print "</style>";
print "</head>";
print "<body>";
print "<p>Thanks for uploading your file!</p>";
print "</body>";
print "</html>";
【问题讨论】:
-
我想今天是周五。这是关于通过网络几乎连续加载文件的第三个问题。 :D
-
几个调试问题。 (1) 您是否尝试过我对上一个问题的回答中的那一行,以查看服务器写入的 temporary 文件?这可能有助于检查该过程的该部分是否有效。这个新脚本也以同样的方式完成。 (2) 您能否添加另一个打印件以及
print UPLOADFILE,以便打印到您肯定可以写入文件的位置,例如您的主目录? -
试试这个打印 UPLOADFILE $_;
-
@zdim - 我确实尝试了你的建议并且得到了相同的结果。我尝试将文件写入 html 目录。文件已创建但为空。
-
似乎问题出在上传过程本身,正如我对您之前 Q 的回答中所述,在第一句和最后一句以及两者之间。将以下诊断信息打印到文件中。我将
$ufh用于$upload_filehandle。 (1) 检查文件句柄 --print "$ufh\n"应该打印GLOB(...)。print fileno($ufh), "\n"应该打印(正!)整数。与print fileno UPLOADFILE相比,应该有所不同。print tell($ufh)应该打印0(文件的开头)。 (2) 在我的答案中链接到的 CGI 文档中使用uploadInfo和其他查询方法,看看你得到了什么。告诉我。