将 "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。
从 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。