有时图片没有扩展名,但仍然有效。我有一个文件上传表单,需要检测文件类型以将其与我的白名单进行比较。
我知道我不相信从浏览器发送的mime类型,所以从研究中我已经看到这些是可用的两个选项(它们仅在上传文件后才起作用):
$info = getimagesize($path);
$imageType = $info['mime'];
和
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$imageType = finfo_file($finfo, $path);
从我做过的测试来看,看起来它们都工作正常,但我想知道是否有任何理由使用这些方法中的一种而不是另一种?
答案 0 :(得分:4)
快速浏览一下php源代码,可以看出getimagesize()
支持以下图片类型:
gif, jpeg, png, swf, psd, bmp, tiff, iff, jpc, jp2, jpx, jb2, xbm, ico
finfo_file
支持更多mime类型,如duskwuff说。在缺点方面,它还会进行更多检查,这会使效率降低一些。
对我的一点测试:
$startTime = microtime(true);
for ($i=0; $i<50000; $i++)
getimagesize("test.png");
echo microtime(true) - $startTime;
$startTime = microtime(true);
for ($i=0; $i<50000; $i++) {
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$imageType = finfo_file($finfo, "test.png");
}
echo '<br>'.(microtime(true) - $startTime);
结果:
0.85886001586914
3.9046602249146
答案 1 :(得分:1)
getimagesize()
仅适用于GD识别的图像文件。即使您已启用所有内容,仍然只有GIF,JPEG,PNG,BMP和XPM图像。 finfo_file()
将为更多种类的文件类型提供MIME类型,因此如果您希望您的代码可用于上传非图像文件,那么它是更好的选择。