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


Posted in PHP onJanuary 06, 2017

前言

在网页设计中,如果需要图片,我们通常拿到的是一个图片的文件名。仅仅通过文件名是无法判断该文件是否是一个图片文件的。或许有的人以为通过后缀名就可以判断,别忘了文件的后缀名是可以随便改动的。更何况,在 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 相关文章推荐
用php获取本周,上周,本月,上月,本季度日期的代码
Aug 05 PHP
10条PHP高级技巧[修正版]
Aug 02 PHP
PHP 在5.1.* 和5.2.*之间 PDO数据库操作中的不同之处小结
Mar 07 PHP
php图片的裁剪与缩放生成符合需求的缩略图
Jan 11 PHP
PHP实现一维数组转二维数组的方法
Feb 25 PHP
基于php的微信公众平台开发入门实例
Apr 15 PHP
摘自织梦CMS中的图片处理类
Aug 08 PHP
php 读取输出其他文件的实现方法
Jul 26 PHP
Yii框架连接mongodb数据库的代码
Jul 27 PHP
全面解析PHP验证码的实现原理 附php验证码小案例
Aug 17 PHP
php用户密码加密算法分析【Discuz加密算法】
Oct 12 PHP
PHP合并数组的2种方法小结
Nov 24 PHP
基于thinkPHP类的插入数据库操作功能示例
Jan 06 #PHP
PHP 文件上传后端处理实用技巧方法
Jan 06 #PHP
PHP+mysql实现从数据库获取下拉树功能示例
Jan 06 #PHP
php中简单的对称加密算法实现
Jan 05 #PHP
WAF的正确bypass
Jan 05 #PHP
phpcms的分类名称和类别名称的调用
Jan 05 #PHP
php 5.4 全新的代码复用Trait详解
Jan 05 #PHP
You might like
支持png透明图片的php生成缩略图类分享
2015/02/08 PHP
基于PHP的登录和注册的功能的实现
2020/08/06 PHP
js 实现无缝滚动 兼容IE和FF
2009/07/15 Javascript
使用dynatrace-ajax跟踪JavaScript的性能
2010/04/12 Javascript
基于jquery的3d效果实现代码
2011/03/23 Javascript
Webkit的跨域安全问题说明
2011/09/13 Javascript
深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
2012/04/12 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
2013/06/24 Javascript
jQuery处理图片加载失败的常用方法
2015/06/08 Javascript
JS实现图片的不间断连续滚动的简单实例
2016/06/03 Javascript
轻松搞定js表单验证
2016/10/13 Javascript
jQuery自定义元素右键点击事件(实现案例)
2017/04/28 jQuery
基于Cookie常用操作以及属性介绍
2017/09/07 Javascript
vue-cli 如何打包上线的方法示例
2018/05/08 Javascript
使用webpack4编译并压缩ES6代码的方法示例
2019/04/24 Javascript
举例讲解Python程序与系统shell交互的方式
2015/04/09 Python
Python的Bottle框架中返回静态文件和JSON对象的方法
2015/04/30 Python
Python基于opencv的图像压缩算法实例分析
2018/05/03 Python
python版DDOS攻击脚本
2019/06/12 Python
python文本数据处理学习笔记详解
2019/06/17 Python
解决Python3用PIL的ImageFont输出中文乱码的问题
2019/08/22 Python
CSS3 mask 遮罩的具体使用方法
2017/11/03 HTML / CSS
HTML5 b和i标记将被赋予真正的语义
2009/07/16 HTML / CSS
BIFFI美国站:意大利BIFFI BOUTIQUES豪华多品牌时装零售公司
2020/02/11 全球购物
C语言变量的命名规则都有哪些
2013/12/27 面试题
亿阳信通股份有限公司笔试题(C#)
2016/03/04 面试题
个人简历中的自我评价怎么写
2014/01/26 职场文书
《狮子和兔子》教学反思
2014/03/02 职场文书
物流管理专业自荐信
2014/06/23 职场文书
调研汇报材料范文
2014/08/17 职场文书
公务员爱岗敬业演讲稿
2014/08/26 职场文书
党员个人对照检查材料范文
2014/09/24 职场文书
银行招聘自荐信
2015/03/06 职场文书
企业党员岗位承诺书
2015/04/27 职场文书
走进毛泽东观后感
2015/06/04 职场文书
Java 通过手写分布式雪花SnowFlake生成ID方法详解
2022/04/07 Java/Android