PHP 判断一个文件是否为图片类型

在PHP中我们经常要使用到针对用户上传的图片的处理,比如用户头像、商品图片等,要控制使用者上传的文件是一个图片类型而不能是随便的一个文件格式,如果不进行控制不仅系统可能存在安全隐患,而且对于业务逻辑来说也没有处理完善。此文档总结如何在PHP中判断一个文件是否为图片类型的多种方法的使用

W3CAPI
1
2020-04-23 08:24:27
文档目录
我的书签
 

PHP 使用 getimagesize函数 来判断文件是否为图片类型

通过文档可以了解到getimagesize函数的功能为:将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP 图像文件的大小并返回图像的尺寸以及文件类型和一个可以用于普通 HTML 文件中 IMG 标记中的 height/width 文本字符串。代码如下:
function isImage($filepath) {
    if(file_exists($filepath))
    {
        if ( !($info = getimagesize($filepath)) ) //获取图片信息
            return false;
        $ext = image_type_to_extension($info['2']); //根据图片信息获取图片类型后缀名
        return $ext; //成功返回图片类型
    }
    else
    {
        return false;
    }
}

PHP 读取文件数据来判断文件是否为图片类型

对于图片来说,它本身也是二进制数据组成,而且它的数据组成是根据一定的规则进行的,分析几种通用的图片文件结构,可以发现他们的前 2 个字节是表示这个图片文件类型的数据,我们可以获取给定文件的前两个字节来判断文件是不是图片文件类型,代码如下:
function  isImage($filepath) {
    $file = fopen($filepath, "rb");
    $bin = fread($file, 2);  // 只读2字节
    fclose($file);
    $strInfo  = @unpack("C2chars", $bin);
    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
    $fileType = '';

    //255216 -> jpg,7173 -> gif ,13780 -> png 仅允许上传jpg/jpeg/gif/png格式的图片
    if($typeCode == 255216  || $typeCode == 7173  || $typeCode == 13780 )  {
        return $typeCode;
    } else  {
        return false;
    }
}

PHP 使用 exif_imagetype函数 来判断文件是否为图片类型

通过文档可以了解到 exif_imagetype函数用于判断一个图像的类型,它读取一个图像的第一个字节并检查其签名。 如果发现了正确的签名则返回一个对应的常量,否则返回 FALSE。返回值和 getimagesize() 返回的数组中的索引 2 的值是一样的,但该函数的执行效率要高很多。实现代码如下:
function  isImage($filepath) {
    if ( !function_exists("exif_imagetype") ) {
        throw new Exception("php_exif 扩展未开启");
    }
    $mimetype = exif_imagetype($filepath);
    if ($mimetype == IMAGETYPE_GIF || $mimetype == IMAGETYPE_JPEG || $mimetype == IMAGETYPE_PNG || $mimetype == IMAGETYPE_BMP) {
       return $mimetype;
    }
    return false;
}
最后附上exif_imagetype函数返回值的常量定义:
常量值 常量名称
1 IMAGETYPE_GIF
2 IMAGETYPE_JPEG
3 IMAGETYPE_PNG
4 IMAGETYPE_SWF
5 IMAGETYPE_PSD
6 IMAGETYPE_BMP
7 IMAGETYPE_TIFF_II(Intel 字节顺序)
8 IMAGETYPE_TIFF_MM(Motorola 字节顺序)
9 IMAGETYPE_JPC
10 IMAGETYPE_JP2
11 IMAGETYPE_JPX
12 IMAGETYPE_JB2
13 IMAGETYPE_SWC
14 IMAGETYPE_IFF
15 IMAGETYPE_WBMP
16 IMAGETYPE_XBM
友情提示