利用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 相关文章推荐
frename PHP 灵活文件命名函数 frename
Sep 09 PHP
ThinkPHP 防止表单重复提交的方法
Aug 08 PHP
php使用filter过滤器验证邮箱 ipv6地址 url验证
Dec 25 PHP
PHP的变量类型和作用域详解
Mar 12 PHP
PHP命名空间(namespace)的动态访问及使用技巧
Aug 18 PHP
PHP获取指定月份第一天和最后一天的方法
Jul 18 PHP
php微信开发之带参数二维码的使用
Aug 03 PHP
PHP微信企业号开发之回调模式开启与用法示例
Nov 25 PHP
PHP实现的折半查找算法示例
Dec 19 PHP
Ajax+PHP实现的模拟进度条功能示例
Feb 11 PHP
php常用日期时间函数实例小结
Jul 04 PHP
laravel-admin select框默认选中的方法
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
德生BCL3000的电路分析和打磨
2021/03/02 无线电
要会喝咖啡也要会知道咖啡豆
2021/03/03 咖啡文化
PHP中用正则表达式清除字符串的空白
2011/01/17 PHP
php中CI操作多个数据库的代码
2012/07/05 PHP
phpphp图片采集后按原路径保存图片示例
2014/02/18 PHP
laravel实现上传图片并在页面显示的例子
2019/10/14 PHP
代码精简的可以实现元素圆角的js函数
2007/07/21 Javascript
javascript取消文本选定的实现代码
2010/11/14 Javascript
基于mootools 1.3框架下的图片滑动效果代码
2011/04/22 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
2013/11/29 Javascript
jquery获取tagName再进行判断
2014/05/29 Javascript
JavaScript为事件句柄绑定监听函数实例详解
2015/12/15 Javascript
Angularjs 自定义服务的三种方式(推荐)
2016/08/02 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
2017/03/15 Javascript
AngularJS路由切换实现方法分析
2017/03/17 Javascript
vue.js实例对象+组件树的详细介绍
2017/10/20 Javascript
Vue组件开发技巧总结
2018/03/04 Javascript
浅谈angular4.0中路由传递参数、获取参数最nice的写法
2018/03/12 Javascript
vue 设置proxyTable参数进行代理跨域
2018/04/09 Javascript
小程序异步问题之多个网络请求依次执行并依次收集请求结果
2019/05/05 Javascript
仿iPhone通讯录制作小程序自定义选择组件的实现
2019/05/23 Javascript
原生js实现的观察者和订阅者模式简单示例
2020/04/18 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
2020/09/08 Javascript
[06:59]DOTA2-DPC中国联赛3月7日Recap集锦
2021/03/11 DOTA
简单谈谈Python中的闭包
2016/11/30 Python
python实现while循环打印星星的四种形状
2019/11/23 Python
Python中remove漏删和索引越界问题的解决
2020/03/18 Python
Erwin Müller穆勒家居瑞士官网:您整个家庭的邮购公司
2019/12/28 全球购物
精伦电子Java笔试题
2013/01/16 面试题
财务总经理岗位职责
2014/02/16 职场文书
四风对照检查材料范文
2014/09/27 职场文书
2014年党员整改措施
2014/10/24 职场文书
redis内存空间效率问题的深入探究
2021/05/17 Redis
浅谈redis缓存在项目中的使用
2021/05/20 Redis
详解Java实践之抽象工厂模式
2021/06/18 Java/Android
python中__slots__节约内存的具体做法
2021/07/04 Python