いくつかの変数を設定するには、サーバー上の特定のファイルが画像である場合の情報が必要です。場所と名前を除いて、ファイルについては何も知りません。
ファイル拡張子を見ずにファイルが画像であるかどうかを検出する方法はありますか?
これを行う簡単な方法は、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
エラーの場合 (存在しないファイル、認識されない形式など) の文字列が含まれます。
編集: ...そしてあなたの質問に完全に答えるために:Ping
フォーマット文字列を返す場合、特定のファイルが画像であると想定するのはおそらく安全です。フォーマット(画像以外のフォーマットも含む)。
JRFerguson はfile
、質問に添付されたコメントでコマンドについて言及しています。これには、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.";
}
アイデアは、既知の画像形式に対して正規表現することです。
あなたはすでに2つの良い答えを得ました。このような場合に役立つツールがもう1つあります。libmagicソリューションよりも遅くなりますが、追加情報とユーティリティのために望ましい場合があります。どのツールがより包括的であるか、エッジケースで失敗する可能性が高いかはわかりません。Image :: 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;
これが私がやった方法の1つです。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);