Getimagesize () vs finfo_file()用于检测图像类型


getimagesize() vs finfo_file() for detecting image type?

有时图像没有扩展名,但仍然有效。我有一个文件上传表单,需要检测文件类型,将其与我的白名单进行比较。

我知道我不能相信从浏览器发送的mime类型,所以从我所做的研究来看,这是两个可用的选项(它们只在上传文件后工作):

$info      = getimagesize($path);
$imageType = $info['mime'];

$finfo     = finfo_open(FILEINFO_MIME_TYPE);
$imageType = finfo_file($finfo, $path);

从我所做的测试中,看起来它们都工作得很好,但我想知道是否有任何理由使用这些方法中的一种而不是另一种?

快速查看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

getimagesize()仅对GD识别的图像文件有效。即使您启用了所有功能,也只能支持GIF、JPEG、PNG、BMP和XPM图像。finfo_file()将为您提供更广泛的文件类型的MIME类型,所以如果您希望您的代码可能用于上传非图像的文件,这是一个更好的选择。