mthoutai

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

今天在做图片上传 验证图片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合法性验证了。执行结果如图所看到的:



posted on 2017-05-11 11:21  mthoutai  阅读(618)  评论(0编辑  收藏  举报