2015-09-18 54 views
2

二進制緩衝區我有圖像緩存從Web檢索之後:應用「文件」 linux命令在Perl

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

如何避免保存原始數據文件,並做了工作記憶是什麼?

回答

11

file可以從STDIN讀取數據。所以,最簡單的方法可能是:

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

似乎有一個模塊 - File::Type它做到這一點。我的快速測試意味着它不如file那麼聰明,使它不那麼有用。

+0

是[文件: :LibMagic](http://p3rl.org/File::LibMagic)更智能? – choroba

+0

不確定,但也似乎適應MIME類型,其中'文件'確實是mor。 – Sobrique

+0

除了他想輸出'file' ... – ikegami

0

這裏的另一種方法:一個JPEG開始與\ XFF \ XD8,GIF圖像開始 「的GIF89a」 或 「GIF87a」 和PNG圖像開始與這些小數:137 80 78 71 13 10 26 10

+0

你也可以在* nix系統上參考'/ usr/share/misc/magic'。這是'file'的作用。 – Sobrique