今天在做圖片上傳 驗證圖片mime值時 突然發現 個別特殊情況下finfo_file 獲取的MIME值不能直接使用,
按照官方的寫法是
$finfo=finfo_open(FILEINFO_MIME);
$mime=finfo_file($finfo,$file_path);
finfo_close($finfo);
alert($mime);
這樣子獲得文件mime類型的
但是今天發現這樣子不行,在文件傳輸中如果有charset設置傳輸類型為二進制流的話, 就會出現類似如下圖那樣:
可以明顯的看到,這裡後面多了 分號 和後面的東西charset=binary
這裡如果再進行文件mime值的驗證,就算是正確合法的文件類型,也無法通過驗證,因為獲取到的mime值後面多了一部分二進制文件流的字符串“; charset=binary”
$file_name = $_FILES['imgFile']['name'];
$temp_arr = explode(".", $file_name);
$file_ext = array_pop($temp_arr);
$file_ext = trim($file_ext);
$file_ext = strtolower($file_ext);
$_mime=array('jpg'=>array('image/pjpeg','image/jpeg'),'gif'=>array('image/gif'),'png'=>array('image/x-png','image/png'),'jpeg'=>array('image/jpeg','image/pjpeg'));
if(empty($mime) || !in_array($mime,$_mime[$file_ext])){
alert('圖片mime類型錯誤!');
}
故而需要做下特殊環境需求下的兼容性處理
修改後的獲得mime類型的兼容性通用方法如下(注意些列紅色部分,通過正則獲得正確的兼容多需求環境下的mime值正確獲取):
if(empty($mime) && function_exists('finfo_open')){
$finfo=finfo_open(FILEINFO_MIME);
$mime=finfo_file($finfo,$file_path);
finfo_close($finfo);
//兼容特應用殊環境下的文件上傳mime精准驗證
$new=preg_match('/([^;]+);?.*$/',$mime,$match);
if($new) $mime=trim($match[1]);
alert($mime);
}
這樣就可以正確的獲得兼容環境下的mime類型進行正確的文件mime合法性驗證了,運行結果如圖所示: