利用PHP判断文件是否为图片的方法总结

5年以前  |  阅读数:786 次  |  编程语言:PHP 

前言

在网页设计中,如果需要图片,我们通常拿到的是一个图片的文件名。仅仅通过文件名是无法判断该文件是否是一个图片文件的。或许有的人以为通过后缀名就可以判断,别忘了文件的后缀名是可以随便改动的。更何况,在 Linux 系统下是不以后缀来区分文件格式的。如果天真的以为通过后缀名就能区分图片,那可能出现错误时,你连错误在哪儿都不知道。比如有一个讨厌的人把一个文本文件改成 background.jpg,然后给你用,你可能只会简单的认为这个图片被损坏了,万万没想到它竟然仅仅是一个文本文件。

为了避免一些不必要的问题出现,在拿到一个图片时,应该正确的判断该文件是否真的一个图片文件。这里总结了三种判断方法,有需要的朋友们可以一起来看看吧。

方法一

利用 getimagesize 函数获取图片信息,然后进行判断:


    <?php # Script -- isimg.php

    /* Author @ Huoty
     * Date @ 2015-11-24 16:59:26
     * Brief @ 
     */

    function isImage($filename)
    {
     $types = '.gif|.jpeg|.png|.bmp'; //定义检查的图片类型
     if(file_exists($filename))
     {
      if (($info = @getimagesize($filename))
       return 0;

      $ext = image_type_to_extension($info['2']);
      return stripos($types,$ext);
     }
     else
     {
      return false;
     }
    }

    if(isImage('isimg.txt')!==false)
    {
     echo isImage('1.jpg');
     echo '是图片';
    }
    else
    {
     echo '不是图片';
    }
    ?>

方法二

读取图片的前 2 个字节,然后判断是不是图片:


    <?php # Script -- isimg2.php

    /* Author @ Huoty
     * Date @ 2015-11-25 16:42:38
     * Brief @ 
     */

    //判断上传的是不是图片 
    function isImg($fileName)
    { 
     $file  = fopen($fileName, "rb"); 
     $bin  = fread($file, 2); // 只读2字节 

     fclose($file); 
     $strInfo = @unpack("C2chars", $bin); 
     $typeCode = intval($strInfo['chars1'].$strInfo['chars2']); 
     $fileType = ''; 

     if($typeCode == 255216 /*jpg*/ || $typeCode == 7173 /*gif*/ || $typeCode == 13780 /*png*/) 
     { 
      return $typeCode; 
     }
     else
     { 
      // echo '"仅允许上传jpg/jpeg/gif/png格式的图片!'; 
      return false; 
     } 
    } 

    if (isImg("1.jpg"))
    {
     echo "是图片";
    }
    else
    {
     echo "不是图片";
    }
    ?>

方法三

最后一种方法是利用 exif_imagetype 函数,该函数用于判断一个图像的类型,采用这种方法更加简单。读取一个图像的第一个字节并检查其签名。 如果发现了恰当的签名则返回一个对应的常量,否则返回 FALSE。返回值和 getimagesize() 返回的数组中的索引 2 的值是一样的,但该函数要快得多。

该函数的返回值常量定义如下:


    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

示例:


    <?php # Script -- isimg3.php

    /* Author @ Huoty
     * Date @ 2015-11-25 16:53:04
     * Brief @ 
     */

    $mimetype = exif_imagetype("1.jpg");
    if ($mimetype == IMAGETYPE_GIF || $mimetype == IMAGETYPE_JPEG || $mimetype == IMAGETYPE_PNG || $mimetype == IMAGETYPE_BMP)
    {
     echo "是图片";
    }
    ?>

总结

以上就是关于PHP判断文件是否为图片的全部内容了,希望本文的内容对大家学习或者使用PHP能有一定的帮助,如果有疑问大家可以留言交流。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例