程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> finfo_file函數獲取文件mime值驗證出錯的解決方法

finfo_file函數獲取文件mime值驗證出錯的解決方法

編輯:關於PHP編程

今天在做圖片上傳 驗證圖片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合法性驗證了,運行結果如圖所示:

\

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved