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