[PHP] 判斷檔案室否為圖片

之前有做上傳圖片的功能.
https://dotblogs.com.tw/grayyin/2016/12/29/191104

若使用者上傳非圖片的檔案,
或者將 病毒.exe 上傳呢?

這邊紀錄一些檢查檔案的做法.

1. 使用PHP 提供的function getimagesize.

<?php  


function isImage($filename)
{
    $types = '.gif|.jpeg|.png|.bmp';  //gif|jepg|png|bmp 四種
    if(file_exists($filename))
    {
        if (($info = getimagesize($filename))
            return 0;
        
        $ext = image_type_to_extension($info['2']);
        return stripos($types,$ext);
    }
    else
    {
        return false;
    }
}
 
if(isImage('isimg.txt')!==false)
{
    echo isImage('image1.jpg');
    echo 'It is image.';
}
else
{
    echo 'It's not image.';
}
?>

2. 檢查圖檔前兩個字元
 

<?php  


function  isImage($fileName)
{ 
    $file     = fopen($fileName, "rb"); 
    $bin      = fread($file, 2);  // 只讀取兩個字元

    fclose($file); 
    $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("image.jpg"))
{
    echo 'It is image.';
}
else
{
    echo 'It is not image.';
}
?>

3. 使用PHP 提供的function exif_imagetype檢查檔案類型
png, jepg, bmp等等, 一共有17種格式檢查.
 

<?php  
function isImage($filename){
   $mimetype = exif_imagetype($filename);
   if ($mimetype == IMAGETYPE_GIF || $mimetype == IMAGETYPE_JPEG || $mimetype == IMAGETYPE_PNG || $mimetype == IMAGETYPE_BMP)
   {
      return true;
   }else{
      return false;
   }
}

if(isImage('image.png'))
{
    echo 'It is image.';
}
else
{
    echo 'It is not image.';
}
?>