利用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 项目的方法
Jan 02 PHP
分享一段php获取linux服务器状态的代码
May 27 PHP
PHP内核探索:哈希表碰撞攻击原理
Jul 31 PHP
PHP 生成微信红包代码简单
Mar 25 PHP
Yii控制器中操作视图js的方法
Jul 04 PHP
Yii2框架数据库简单的增删改查语法小结
Aug 31 PHP
PHPMailer发送邮件
Dec 28 PHP
php从身份证获取性别和出生年月
Feb 09 PHP
yii框架无限极分类的实现方法
Apr 08 PHP
php实现查询功能(数据访问)
May 23 PHP
PHP crypt()函数的用法讲解
Feb 15 PHP
tp5.1 框架join方法用法实例分析
May 26 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
如何将数据从文本导入到mysql
2006/10/09 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
2018/03/02 PHP
Javascript 原型和继承(Prototypes and Inheritance)
2009/04/01 Javascript
强大的jquery插件jqeuryUI做网页对话框效果!简单
2011/04/14 Javascript
基于jquery实现的文字淡入淡出效果
2013/11/14 Javascript
js实现select跳转功能代码
2014/10/22 Javascript
js中document.write的那点事
2014/12/12 Javascript
轻松创建nodejs服务器(2):nodejs服务器的构成分析
2014/12/18 NodeJs
DOM基础教程之使用DOM + Css
2015/01/20 Javascript
js实现同一页面可多次调用的图片幻灯切换效果
2015/02/28 Javascript
JavaScript中的this关键字使用详解
2015/08/14 Javascript
深入解析Javascript闭包的功能及实现方法
2016/07/10 Javascript
微信小程序开发教程之增加mixin扩展
2017/08/09 Javascript
mpvue构建小程序的方法(步骤+地址)
2018/05/22 Javascript
微信小程序判断用户是否需要再次授权获取个人信息
2019/07/18 Javascript
Vue实现base64编码图片间的切换功能
2019/12/04 Javascript
jQuery实现的上拉刷新功能组件示例
2020/05/01 jQuery
vue使用Sass时报错问题的解决方法
2020/10/14 Javascript
[00:36]DOTA2上海特级锦标赛 Archon战队宣传片
2016/03/04 DOTA
详细解析Python中__init__()方法的高级应用
2015/05/11 Python
Python异常对代码运行性能的影响实例解析
2018/02/08 Python
python脚本监控Tomcat服务器的方法
2018/07/06 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
2018/10/29 Python
python 处理telnet返回的More,以及get想要的那个参数方法
2019/02/14 Python
pywinauto自动化操作记事本
2019/08/26 Python
Python Subprocess模块原理及实例
2019/08/26 Python
python 获取剪切板内容的两种方法
2020/11/28 Python
HTML5新控件之日期和时间选择输入的实现代码
2018/09/13 HTML / CSS
利用html5的websocket实现websocket聊天室
2013/12/12 HTML / CSS
澳大利亚药房在线:ThePharmacy
2017/10/04 全球购物
简历自我评价怎么写好呢?
2014/01/04 职场文书
总经理工作职责范文
2014/03/14 职场文书
新学期开学标语
2014/06/30 职场文书
2014年居委会工作总结
2014/12/09 职场文书
2015年办公室主任工作总结
2015/04/09 职场文书
MySQL分区路径子分区再分区
2022/04/13 MySQL