利用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 相关文章推荐
利用discuz自带通行证整合dedecms的方法以及文件下载
Mar 06 PHP
快速开发一个PHP扩展图文教程
Dec 12 PHP
PHP与SQL注入攻击防范小技巧
Sep 16 PHP
国外PHP程序员的13个好习惯小结
Feb 20 PHP
浅析php与数据库代码开发规范
Aug 08 PHP
PHP中session变量的销毁
Feb 27 PHP
codeigniter上传图片不能正确识别图片类型问题解决方法
Jul 25 PHP
phplot生成图片类用法详解
Jan 06 PHP
PHP实现页面静态化的超简单方法
Sep 06 PHP
jquery不支持toggle()高(新)版本的问题解决
Sep 24 PHP
PHP水印类,支持添加图片、文字、填充颜色区域的实现
Feb 04 PHP
基于laravel-admin 后台 列表标签背景的使用方法
Oct 03 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中preg_replace正则替换用法分析【一次替换多个值】
2017/01/17 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
JS正则表达式获取分组内容的方法详解
2013/11/15 Javascript
WebGL利用FBO完成立方体贴图效果完整实例(附demo源码下载)
2016/01/26 Javascript
JQuery 的跨域方法推荐_可跨任何网站
2016/05/18 Javascript
jQuery双向列表选择器select版
2016/11/01 Javascript
js对象实例详解(JavaScript对象深度剖析,深度理解js对象)
2017/09/21 Javascript
JQuery元素快速查找与操作
2018/04/22 jQuery
javascript sort()对数组中的元素进行排序详解
2019/10/13 Javascript
40行代码把Vue3的响应式集成进React做状态管理
2020/05/20 Javascript
vue 计算属性和侦听器的使用小结
2021/01/25 Vue.js
用Python制作在地图上模拟瘟疫扩散的Gif图
2015/03/31 Python
复习Python中的字符串知识点
2015/04/14 Python
python传递参数方式小结
2015/04/17 Python
Python自动化部署工具Fabric的简单上手指南
2016/04/19 Python
python3实现UDP协议的服务器和客户端
2017/06/14 Python
python实现抖音视频批量下载
2018/06/20 Python
在Mac下使用python实现简单的目录树展示方法
2018/11/01 Python
如何使用Python 打印各种三角形
2019/06/28 Python
Pandas的read_csv函数参数分析详解
2019/07/02 Python
python异步编程 使用yield from过程解析
2019/09/25 Python
keras实现图像预处理并生成一个generator的案例
2020/06/17 Python
Net-A-Porter美国官网:全球时尚奢侈品名站
2017/02/11 全球购物
意大利香水和彩妆护肤品购物网站:Ditano
2017/08/13 全球购物
Diamondback自行车:拥有你的冒险
2019/04/22 全球购物
青春奉献演讲稿
2014/05/08 职场文书
2014市国税局对照检查材料思想汇报
2014/09/23 职场文书
年度考核登记表个人总结
2015/03/06 职场文书
新员工试用期自我评价
2015/03/10 职场文书
物业保安辞职信
2015/05/12 职场文书
2015年思想品德教学工作总结
2015/07/22 职场文书
2016年第104个国际护士节活动总结
2016/04/06 职场文书
如何让2019年上半年的工作总结更出色!
2019/07/01 职场文书
Mysql中调试存储过程最简单的方法
2021/06/30 MySQL
springboot + mongodb 通过经纬度坐标匹配平面区域的方法
2021/11/01 MongoDB
Python可变集合和不可变集合的构造方法大全
2021/12/06 Python