为了设置一些变量,如果我的服务器上的给定文件是图像,我需要这些信息。我对文件的位置和名称一无所知。
有没有办法在不查看文件扩展名的情况下检测文件是否为图像?
一个简单的方法是通过PerlMagick CPAN 模块将工作委托给 ImageMagick。Identify
和Ping
方法就是为此目的而设计的。
use strict;
use Image::Magick;
my $im = Image::Magick->new();
my ($width, $height, $size, $format) = $im->Ping('/path/to/my/image.jpg');
执行这个小程序后,$format
变量将包含一个带有已识别图像格式的字符串(在本例中:“JPEG”),或者undef
在错误的情况下(不存在的文件、无法识别的格式等)。
编辑: ...并完全回答您的问题:如果返回格式字符串,并且如果它是您决定从 ImageMagick支持的列表中Ping
列入白名单的任何子集的一部分,则可以安全地假设给定文件是图像格式(也包括非图像格式)。
JRFergusonfile
在附加到问题的评论中提到了该命令。它带有一个 C 库对应部分,libmagic
. Perl 绑定称为File::LibMagic。
use File::LibMagic qw();
my $detect = File::LibMagic->new;
$detect->checktype_filename("first_success.jpg") =~ /^image/
对于图像类型,表达式返回 true。
file
正如@JRFerguson 首次提到的,该命令与File::LibMagic
、Image::Magick
或相比具有限制Image::ExifTool
。
但是file
当您无法安装或使用这些模块时非常好。至于示例代码,您可以使用以下内容:
my $file = "/dir/images/image.jpg";
my $type = `file $file`;
unless ($type =~ /JPEG/i
|| $type =~ /PNG/i) {
print "The file is not a valid JPEG or PNG.";
}
这个想法只是针对已知的图像格式进行正则表达式。
你已经得到了两个很好的答案。在这些情况下,还有一种工具可能很有价值。它会比 libmagic 解决方案慢,但有时它更适合额外的信息和实用程序。我不知道哪种工具更全面或在边缘情况下可能会失败。图片::ExifTool –
use Image::ExifTool "ImageInfo";
my $info = ImageInfo(shift || die "Give an image file!\n");
print "This is a ", $info->{FileType}, "\n";
use Data::Dump "pp";
print "Here's more...\n";
pp $info;
这是我做到这一点的方法之一。使用 perl 模块形式的 CPAN "Image-Size-3.300 > Image::Size"。它还具有文件属性图像“类型”。然后,您可以获取这些变量并使用这些信息来处理您的应用程序的代码。
#!/usr/bin/perl
use Image::Size;
print "Content-type: text/html\n\n";
my ($image_width, $image_height, $image_type) = imgsize("path/image.jpg");
unless ($image_type =~ /JPG/i
|| $image_type =~ /PNG/i) {
print "The file is not a valid JPG or PNG.";
}
#To see the results printed to the web browser
print "<br>(image.jpg) $image_width - $image_height - $image_type<br>\n";
exit(0);