PHP判斷檔案是否為圖片的方法

最凶殘的小海豹發表於2020-12-26

廢話不多說,主要是針對於一些更改檔案字尾為.jpg等圖片的,還有就是改成.php.jpg 等等,下面提供三種方法;

方法一(推薦):
使用 exif_imagetype 函式,該函式用於判斷一個影像的型別。函式讀取一個影像的第一個位元組並檢查其簽名,如果發現了恰當的簽名則返回一個對應的常量,否則返回 FALSE。返回值和 getimagesize() 返回的陣列中的索引 2 (方法二的 $info['2'] )的值是一樣的,但該函式要快得多。

$path = '圖片地址';
$mimetype = exif_imagetype($path);
if ($mimetype == IMAGETYPE_GIF || $mimetype == IMAGETYPE_JPEG || $mimetype == IMAGETYPE_PNG || $mimetype == IMAGETYPE_BMP){
	echo "是圖片";
}else {
	echo "不是圖片";
}

該函式的返回值常量定義如下

IMAGETYPE_GIF
IMAGETYPE_JPEG
IMAGETYPE_PNG
IMAGETYPE_SWF
IMAGETYPE_PSD
IMAGETYPE_BMP
IMAGETYPE_TIFF_II(Intel 位元組順序)
IMAGETYPE_TIFF_MM(Motorola 位元組順序)
IMAGETYPE_JPC
IMAGETYPE_JP2
IMAGETYPE_JPX
IMAGETYPE_JB2
IMAGETYPE_SWC
IMAGETYPE_IFF
IMAGETYPE_WBMP
IMAGETYPE_XBM

方法二:
getimagesize函式獲取圖片資訊,然後進行判斷。

$path = '圖片地址';
function isImage($imgPath){
	$types = '.gif|.jpeg|.png|.bmp'; //定義檢查的圖片型別
	if(file_exists($imgPath)){
		if($info = getimagesize($imgPath)) return 0;
		$ext = image_type_to_extension($info['2']);
		return stripos($types, $ext);
	}else {
	  return false;
	}
}
  
if(isImage($path)!==false){
	echo '是圖片';
}else {
	echo '不是圖片';
}

方法三:
讀取圖片的前 2 個位元組,然後判斷是不是圖片

function isImage($imgPath){ 
	$file  = fopen($imgPath, "rb"); 
	$bin  = fread($file, 2); // 只讀2位元組 

	fclose($file); 
	// 標識前兩個字元按照,c格式,陣列索引chars1、chars2
	$strInfo = unpack("C2chars", $bin); 
	$typeCode = intval($strInfo['chars1'].$strInfo['chars2']); 
	$fileType = ''; 

	if($typeCode == 255216 /*jpg*/ || $typeCode == 7173 /*gif*/ || $typeCode == 13780 /*png*/) { 
		return $typeCode; 
	}else {
		return false; 
	} 
}
  
if(isImage($path)!==false){
	echo '是圖片';
}else {
	echo '不是圖片';
}

以上方法均已測試。

相關文章