在处理上传请求之前,如何在Perl中获取文件大小?

时间:2010-04-26 07:59:07

标签: perl upload cgi filesize

我想获得文件大小我正在这样做:

my $filename=$query->param("upload_file");
my $filesize = (-s $filename);
print "Size: $filesize ";`

然而它没有用。请注意,我没有上传文件。我想在上传之前检查它的大小。所以将其限制为最大1 MB。

8 个答案:

答案 0 :(得分:5)

在上传之前,您无法知道某些内容的大小。但是您可以检查浏览器发送的Content-Length请求标头(如果有)。然后,您可以决定是否要相信它。请注意,Content-Length将是整个请求流的长度,包括其他表单字段,而不仅仅是文件上载本身。但这足以让你成为一致的客户。

由于您似乎在普通CGI下运行,因此您应该能够在$ENV{CONTENT_LENGTH}中获取请求体长。

答案 1 :(得分:3)

还要对可能已经有post max set(来自perldoc CGI)的健全性检查:

  

$CGI::POST_MAX

     

如果设置为非负整数,则此变量将大小设置为上限   帖子,以字节为单位。如果CGI.pm检测到一个大于上限的POST,   它将立即退出并显示错误消息。该值将影响两者   普通的POST和多部分POST,意味着它限制了最大的大小   文件上传也是如此。您应该将其设置为相当高的值,例如   1兆字节。

答案 2 :(得分:2)

提交表单时,上传的文件存放在服务器上的tmp位置,检查文件大小。

提供$ field的值。

my $upload_filehandle = $query->upload($field);
my $tmpfilename = $query->tmpFileName($upload_filehandle);
my $file_size = (-s $tmpfilename);

答案 3 :(得分:1)

这与Perl无关。

您正在尝试使用读取服务器上文件的命令读取用户计算机上文件的文件大小,使用Perl无法完成所需的操作。

这是必须在浏览器中完成的事情,并简要地看一下these questions它是非常困难还是不可能。

最好的办法是允许用户开始上传,如果文件太大,则中止。

答案 4 :(得分:1)

如果要在处理请求之前进行检查,最好还是检查触发请求的网页。我不认为网络浏览器可以自己做,但如果你不介意Flash,有很多Flash上​​传工具可以检查大小(以及文件类型)和阻止上传。

一个好的开始是YUI Uploader。还有更多:What is the best multiple file JavaScript / Flash file uploader?

显然你也想检查服务器端,但是当用户开始向服务器发送请求时,你已经在耗尽你的CPU周期和带宽。

答案 5 :(得分:1)

感谢大家的回复;我刚刚发现为什么$filesize = (-s $filename);以前没有工作,这是因为我在发送Ajax请求时检查文件大小而不是在重新提交页面时。这就是为什么我的大小为零。我修复了提交页面的问题。感谢。

答案 6 :(得分:0)

刚刚阅读这篇文章,但在检查内容长度是一个很好的近似预检查时,您也可以将文件保存到临时文件夹,然后对其进行任何类型的检查。如果它不符合您的标准,只需删除,不要将其发送到它的最终目的地。

答案 7 :(得分:-3)

查看文件统计信息-X - perldoc.perl.orgstat-perldoc.perl.org的perl文档。此外,你可以看看这个upload script正在做你正在做的类似事情。