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

时间:2014-07-20 17:02:12

标签: php file-upload

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

我知道我不相信从浏览器发送的mime类型,所以从研究中我已经看到这些是可用的两个选项(它们仅在上传文件后才起作用):

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

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

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

2 个答案:

答案 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类型,因此如果您希望您的代码可用于上传非图像文件,那么它是更好的选择。