PHP上传文件时$_FILES['type']与finfo_file返回MIME类型不一致问题
PHP文件上传中MIME类型不一致与图像创建报错问题解析
为什么finfo_file和$_FILES['file']['type']输出不一致?
$_FILES['file']['type']是客户端浏览器提供的MIME类型,完全不可靠。它由浏览器根据文件扩展名、本地系统的文件关联规则生成,可能被伪造,也可能因浏览器识别逻辑错误出现偏差。finfo_file是通过读取文件内容的**魔数(Magic Number)**来判断真实MIME类型,属于服务器端可靠的检测方式,结果能准确反映文件的实际类型。
小文件被识别为PNG、大文件为JPEG,以及imagecreatefrompng报错的原因
你遇到的大小文件MIME标记差异,是客户端浏览器的识别异常导致的:比如浏览器对小文件直接通过扩展名判断类型,大文件触发了不同的检测逻辑;或者用户本地修改了文件扩展名(比如把JPEG文件改成.png),浏览器跟着错误的扩展名返回了错误的MIME类型。
而你调用imagecreatefrompng时,若依赖的是$_FILES['file']['type']这个错误的类型标记,实际文件是JPEG格式,自然会因类型不匹配抛出异常。
解决方案
- 彻底放弃使用
$_FILES['file']['type'],只用服务器端检测方式获取真实文件类型:
$finfo = finfo_open(FILEINFO_MIME_TYPE); $realMimeType = finfo_file($finfo, $file['tmp_name']); finfo_close($finfo);
- 根据真实MIME类型选择对应的图像创建函数:
switch($realMimeType) { case 'image/jpeg': $image = imagecreatefromjpeg($target); break; case 'image/png': $image = imagecreatefrompng($target); break; case 'image/gif': $image = imagecreatefromgif($target); break; default: throw new Exception('不支持的图像类型'); }
- 不要依赖文件扩展名判断类型,扩展名可被伪造,必须以文件内容的检测结果为准。
内容的提问来源于stack exchange,提问作者Hubert Wajda
相关产品推荐
相关产品推荐

