ディレクトリ内のファイル形式(拡張子)を「exif_imagetype()」関数を利用して取得する平成30年 9月 15日 作成

00141

概略

フォルダ内画像ファイルの形式を調べる方法は多々あるが、拡張子が変更されていた場合(故意・過失に関わらず)においても正確に判断・対応できなものか..。

拡張子が変更されていた場合においても正確にファイル形式(拡張子)が判断できるスクリプトを作成を目指す。

手段

scandir関数にてフォルダ内データを読み取る。

その読み込んだフォルダ内ファイルをexif_imagetype関数にてファイル命式を判断。


exif_imagetype関数の特徴

読み込んだファイルの先頭バイトを読みそのサイン(定数)を返してくれる。(画像形式でなければfalseを返す。)

実装方法

対象フォルダ内のファイルを読み込み、指定した拡張子画像のみを許可するサンプルコード。

<?php
	$dir = "ファイルパスを含むファイル名";
	$files = scandir($dir);
	
	// Imagetype定数は必要なものだけを選択し連想配列としている
	$imagetype_number = array(1 => "gif", 2 => "jpg", 3 => "png", 5 => "psd", 6 => "bmp", 7 => "tiff");
	$list = array();
	
	foreach($files as $value){
		if($value != "." && $value != ".."){
			// exif_imagetypeの定数と$imagetype_number(key値)を比較
			// 必要なだけのバイト数を読み込めない場合(空ファイル等)エラーを出すので「@」でエラー表示を抑制
			if(in_array(@exif_imagetype($dir.$value), array_keys($imagetype_number))){
				// 一致した場合、$imagetype_number(value値)を出力
				$list[$value] = $imagetype_number[exif_imagetype($dir.$value)];
			}else{
				$list[$value] = '画像ファイルではないか、許可されていない画像形式ファイルです';
			}
		}
	}
	
	var_dump($list);
	
	// 対象フォルダ内に下記ファイルが存在した場合
	01.jpg 02.jpg 03.png 01.txt
	
	// 結果
	array(4) {
	["01.jpg"]=>
	string(11) "jpeg"
	["02.jpg"]=>
	string(11) "jpeg"
	["03.png"]=>
	string(11) "png"
	["01.txt"]=>
	string(91) "画像ファイルではないか、許可されていない画像形式ファイルです"
	}
	
	
	// foreach()内は下記記載の方がよいのかな
	if($value == "." || $value == ".."){
		continue;
	}
?>

PHP Manual exif_imagetype

考察

拡張子を書き換えても元の拡張子をきちんと判定しれくれる内容となった。

アップロード次のファイル判定等に役立と思われる。

「getimagesize()」関数でも同様な判定ができ、こちらは画像サイズ等も取得できる。

拡張子の書き換えが心配がない場合には「pathinfo()」関数でも問題はないと感じた。

最後までお読み下さり ありがとうございました。記事はここ迄です。

尚、本記事は作成から「5年以上」経過しています。

記事作成当時と現在の状況等により内容が適切でない場合があります。また、リンク切れが生じている場合もあります事を予めご了承下さい。

お気に入りに登録しますとお気に入り記事を一元管理でき、再度閲覧したい場合等 容易に記事を探し出す事ができますのでご活用下さい。

下段にはコメントを掲載しております。

広告バナー

コメント

頂いたコメントを下記に掲載しております。更に下部にはコメント投稿フォームを設けております。

注意事項を確認・了承した上、コメント投稿お願いいたします。

注意事項に該当するコメントにつきましては、事前告知なしに投稿したコメントの削除を行う場合があります。

予めご了承下さい。

  • 記事内容と無関係なコメント
  • 公序良俗に反するコメント
  • 個人情報や法令違反を含むコメント
  • その他、管理者が不適切と判断したコメント

現在 頂いているコメントはありません

返信先(コメント管理番号)コメントに対し返信する場合のみ
お名前・ハンドルネーム2~32文字内で入力下さい
メールアドレス公開される事はありません
電話番号半角数字+ハイフンで入力下さい
コメント全角500文字内で入力下さい