关于finfo_file函数获取文件mime值验证出错的问题

来源:互联网 发布:java开发实战1200例 编辑:程序博客网 时间:2024/05/22 12:57

今天在做图片上传 验证图片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 0