将 "file" linux 命令应用于 Perl 中的二进制缓冲区

Applying "file" linux command to binary buffer in Perl

从 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";

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

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

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

似乎有一个模块 - File::Type 可以执行此操作。我的快速测试表明它不如 file 聪明,因此用处不大。

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