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