2

从 Web 检索图像后,我在缓冲区中有图像:

my $img = $webapi->get('http://myserver.com/image/123423.jpg');

调用后,原始数据在 $img 中。我想确保数据代表图像而不是文本,因此我将其保存到磁盘上的文件并运行文件命令:

open my $fh, '>', '/tmp/images/rawdata.bin';
print $fh $img;
close $fh;
$res = `file /tmp/images/rawdata.bin`;
if ($res =~ 'GIF|JPEG|PNG') print "Image";
else "Not image";

如何避免将原始数据保存到文件并在内存中完成工作?

4

2 回答 2

11

file可以从中读取数据STDIN。所以最简单的方法可能是:

open ( my $file_cmd, '|-', 'file -' ) or die $!;
print {$file_cmd} $img;
print <$file_cmd>;

似乎有一个模块 -File::Type执行此操作。我的快速测试表明它不如file让它变得不那么有用那么聪明。

于 2015-09-18T08:57:03.570 回答
0

这是另一种方法:Jpeg 以 \xFF \xD8 开头,GIF 以“GIF89a”或“GIF87a”开头,PNG 以这些小数开头:137 80 78 71 13 10 26 10。

于 2015-09-18T13:04:05.487 回答