2011-03-07 34 views
0

我使用下面的代码:我怎么能按类型用Perl(如巴纽,.BMP,.JPG)筛选文件上传

#!/usr/bin/perl -wT 

use strict; 
use CGI; 
use CGI::Carp qw (fatalsToBrowser); 
use File::Basename; 

my $query = new CGI; 
my $filename = $query->param("photo"); 
my $user_username = $query->param("text_value"); 

$CGI::POST_MAX = 1024 * 5000; 
my $safe_filename_characters = "a-zA-Z0-9_.-"; 
my $upload_dir = "/" . $user_username; 

if (!$filename) 
{ 
print $query->header (); 
print "There was a problem uploading your photo (try a smaller file)."; 
exit; 
} 

my ($name, $path, $extension) = fileparse ($filename, '\..*'); 
$filename = "user_pro_pic" . ".png"; 
$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 "$user_username"; 
print "<script> location.href='http://google.com/' </script>"; 
+0

欢迎使用超级用户!预计超级用户的问题通常以某种方式与计算机软件或计算机硬件相关,在[faq](http://superuser.com/faq)中定义的范围内。编程问题被视为超级用户的主题。你可能想问这[Stack Overflow](http://stackoverflow.com)。 - 投票结束 – BloodPhilia 2011-03-07 21:13:00

+0

@BloodPhilia:建议OP点击旗帜链接要求主持人移动问题最好。否则,OP会发布一个重复*和*问题被迁移,留下碎片在这里,在那里和你。 – 2011-03-07 22:55:45

+1

[我如何通过Perl类型过滤文件上传(例如.png,.bmp,.jpg)](http://stackoverflow.com/questions/5225497/how-can-i-filter-a -file-upload-by-type-perl-eg-png-bmp-jpg) – 2011-03-08 10:48:43

回答

2

检出Data::FormValidator并专门上传Data::FormValidator::Constraints::Upload

Data :: FormValidator是处理CGI params验证的方法。您将验证逻辑分隔到一个配置文件中,您的自定义验证代码将缩减为几行。

+0

截至目前,我无法批准这项建议。查看[File :: MMagic的评论](http://cpanratings.perl.org/dist/File-MMagic),其中包含Data :: FormValidator的作者。 – daxim 2011-03-09 19:03:18

-1

在测试无效字符的部分之后,可以比较文件扩展名的$ filename后缀。当然,问题是文件的实际内容可能不匹配(他们通常会这样做,但你不能总是依赖于此)...

if($ filename =〜/。(jpe ?G | GIF | PNG | PDF)$ /){#---检查.JPG,.JPEG,.GIF .png或.PDF
 #---支持的文件类型
}其他{
 #---不支持的文件类型
}

如果需要实际的比较基于MIME类型,检测到的文件内容类型,然后将需要更多的处理能力(apache httpd的提供模块来检测可能有用的MIME类型,但您也可能需要升级到modperl_2并使用libapreq2来访问此API)。

但是,对于大多数情况下,一个简单的文件扩展名测试应该没问题。

0

File::LibMagic是优越的检测器。未经测试:

use File::LibMagic; 
my $flm = File::LibMagic->new; 
… 
my $mime_type = $flm->checktype_filename($filename); 
die 'Type not accepted.' unless $mime_type =~ m|image/(?:png|jpeg)|; 
相关问题