利用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 UTF8编码内的繁简转换类
Jul 20 PHP
php设计模式 Chain Of Responsibility (职责链模式)
Jun 26 PHP
PHP字符串的编码问题的详细介绍
Apr 27 PHP
php unset全局变量运用问题的深入解析
Jun 17 PHP
php的memcache类分享(memcache队列)
Mar 26 PHP
yii操作cookie实例简介
Jul 09 PHP
php利用事务处理转账问题
Apr 22 PHP
thinkPHP统计排行与分页显示功能示例
Dec 02 PHP
PHP 中魔术常量的实例详解
Oct 26 PHP
PHP实现求连续子数组最大和问题2种解决方法
Dec 26 PHP
实例说明js脚本语言和php脚本语言的区别
Apr 04 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
Feb 22 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中json_encode()和json_decode()
2014/05/25 PHP
php中的单引号、双引号和转义字符详解
2017/02/16 PHP
PDO::prepare讲解
2019/01/29 PHP
javascript实现的基于金山词霸网络翻译的代码
2010/01/15 Javascript
javascript showModalDialog 内跳转页面的问题
2010/11/25 Javascript
正则表达式中特殊符号及正则表达式的几种方法总结(replace,test,search)
2013/11/26 Javascript
jquery 提示信息显示后自动消失的具体实现
2013/12/18 Javascript
JS批量修改PS中图层名称的方法
2014/01/26 Javascript
多种方法实现load加载完成后把图片一次性显示出来
2014/02/19 Javascript
js 事件截取enter按键页面提交事件示例代码
2014/03/04 Javascript
编写自己的jQuery提示框(Tip)插件
2015/02/05 Javascript
jQuery隐藏和显示效果实现
2016/04/06 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
2016/05/10 Javascript
Bootstrap框架实现广告轮播效果
2016/11/28 Javascript
nodejs中使用HTTP分块响应和定时器示例代码
2017/03/19 NodeJs
Vuex利用state保存新闻数据实例
2017/06/28 Javascript
JavaScript中Object值合并方法详解
2017/12/22 Javascript
微信小程序出现wx.navigateTo页面不跳转问题的解决方法
2017/12/26 Javascript
JS实现将链接生成二维码并转为图片的方法
2018/03/17 Javascript
微信小程序rich-text富文本用法实例分析
2019/05/20 Javascript
vue3为什么要用proxy替代defineProperty
2020/10/19 Javascript
Python实现简易端口扫描器代码实例
2017/03/15 Python
Python实现树莓派WiFi断线自动重连的实例代码
2017/03/16 Python
关于Tensorflow分布式并行策略
2020/02/03 Python
Python中flatten( ),matrix.A用法说明
2020/07/05 Python
python报错: 'list' object has no attribute 'shape'的解决
2020/07/15 Python
Java byte数组操纵方式代码实例解析
2020/07/22 Python
FLIR美国官网:热成像, 夜视和红外摄像系统
2018/07/13 全球购物
SQL面试题
2013/12/09 面试题
幼儿园教师奖惩制度
2014/02/01 职场文书
家长通知书教师评语
2014/04/17 职场文书
基层党员对照检查材料
2014/09/24 职场文书
英文感谢信格式
2015/01/21 职场文书
CSS3实现三角形不断放大效果
2021/04/13 HTML / CSS
一些让Python代码简洁的实用技巧总结
2021/08/23 Python
Windows server 2012 R2 安装IIS服务器
2022/04/29 Servers