利用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 相关文章推荐
Ajax+PHP 边学边练 之二 实例
Nov 24 PHP
深入理解PHP原理之错误抑制与内嵌HTML分析
May 02 PHP
PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-3 代码组织和重用2
Jul 03 PHP
PHP隐形一句话后门,和ThinkPHP框架加密码程序(base64_decode)
Nov 02 PHP
Zend的MVC机制使用分析(一)
May 02 PHP
php去除数组中重复数据
Nov 18 PHP
浅谈ThinkPHP的URL重写
Nov 25 PHP
PHP利用hash冲突漏洞进行DDoS攻击的方法分析
Mar 26 PHP
php生成固定长度纯数字编码的方法
Jul 09 PHP
PHP语法小结之基础和变量
Nov 22 PHP
yii2整合百度编辑器umeditor及umeditor图片上传问题的解决办法
Apr 20 PHP
Laravel下生成验证码的类
Nov 15 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
基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
2013/05/15 PHP
Javascript实例教程(19) 使用HoTMetal(1)
2006/12/23 Javascript
用jquery实现学校的校历(asp.net+jquery ui 1.72)
2010/01/01 Javascript
javascript cookies 设置、读取、删除实例代码
2010/04/12 Javascript
js实现的二级横向菜单条实例
2015/08/22 Javascript
jQuery实现可用于博客的动态滑动菜单完整实例
2015/09/17 Javascript
微信小程序 五星评价功能的实现
2017/03/09 Javascript
es6 字符串String的扩展(实例讲解)
2017/08/03 Javascript
vue.js 微信支付前端代码分享
2018/02/10 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
2018/06/28 Javascript
微信小程序 冒泡事件原理解析
2019/09/27 Javascript
Jquery $.map使用方法实例详解
2020/09/01 jQuery
[58:09]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第三场 6.2
2018/06/03 DOTA
python中使用sys模板和logging模块获取行号和函数名的方法
2014/04/15 Python
Python程序中用csv模块来操作csv文件的基本使用教程
2016/03/03 Python
Python基于identicon库创建类似Github上用的头像功能
2017/09/25 Python
对Python w和w+权限的区别详解
2019/01/23 Python
Python使用pyserial进行串口通信的实例
2019/07/02 Python
基于python全局设置id 自动化测试元素定位过程解析
2019/09/04 Python
使用python+whoosh实现全文检索
2019/12/09 Python
Django模板之基本的 for 循环 和 List内容的显示方式
2020/03/31 Python
解决Python数据可视化中文部分显示方块问题
2020/05/16 Python
菲律宾领先的在线时尚商店:Zalora菲律宾
2018/02/08 全球购物
精伦电子Java笔试题
2013/01/16 面试题
旅游管理本科生求职信
2013/10/14 职场文书
会计专业的自荐信
2013/12/12 职场文书
物业门卫岗位职责
2013/12/28 职场文书
工程班组长岗位职责
2013/12/30 职场文书
新年主持词
2014/03/27 职场文书
机房搬迁方案
2014/05/01 职场文书
社区先进事迹材料
2014/05/19 职场文书
运动会广播稿100字
2014/09/14 职场文书
民主生活会对照检查材料
2014/09/22 职场文书
居委会个人对照检查材料思想汇报
2014/09/29 职场文书
董事长致辞
2015/07/29 职场文书
mysql 体系结构和存储引擎介绍
2022/05/06 MySQL