【问题标题】:getimagesize() vs finfo_file() for detecting image type?getimagesize() vs finfo_file() 用于检测图像类型?
【发布时间】:2014-09-11 05:37:21
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: php file-upload


    【解决方案1】:

    快速浏览一下 php 源代码会发现 getimagesize() 支持以下图像类型:

    gif, jpeg, png, swf, psd, bmp, tiff, iff, jpc, jp2, jpx, jb2, xbm, ico
    

    finfo_file 支持更多的 mime 类型,就像黄昏说的那样。不利的一面是,它还会进行更多检查,从而降低了效率。

    我的一个小测试:

    $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
    

    【讨论】:

    • 如果您将 finfo_open() 移到循环之外,您的基准测试结果是否会发生显着变化?
    • “它们通过识别扩展名来工作,而不是解析二进制文件” - 嗯?!这些函数实际上很好地查看了二进制数据;他们至少在尝试解析一些幻数和/或标题。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2015-04-24
      • 2016-07-19
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多