finfo_file函数获取文件mime值验证出错的解决方法_PHP教程
Jul 13, 2016 am 10:29 AM今天在做图片上传 验证图片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合法性验证了,运行结果如图所示:

Article chaud

Outils chauds Tags

Article chaud

Tags d'article chaud

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel détaillé sur l'établissement d'une connexion à une base de données à l'aide de MySQLi en PHP

iOS 18 ajoute une nouvelle fonction d'album 'Récupéré' pour récupérer les photos perdues ou endommagées

Quels sont les avantages et les inconvénients du C++ par rapport aux autres langages de développement web ?

Comment Go WebSocket s'intègre-t-il aux bases de données ?

Comment utiliser les fonctions de rappel de base de données dans Golang ?

Comment gérer les erreurs de connexion à la base de données en PHP

Comment gérer les connexions et les opérations de base de données en utilisant C++ ?

Comment récupérer les données JSON de la base de données dans Golang ?
