利用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 正则表达式小结
Aug 31 PHP
那些年一起学习的PHP(三)
Mar 22 PHP
php压缩HTML函数轻松实现压缩html/js/Css及注意事项
Jan 27 PHP
php中simplexml_load_string使用实例分享
Feb 13 PHP
Thinkphp模板标签if和eq的区别和比较实例分析
Jul 01 PHP
php基于curl实现随机ip地址抓取内容的方法
Oct 11 PHP
浅谈PHP中关于foreach使用引用变量的坑
Nov 14 PHP
php json相关函数用法示例
Mar 28 PHP
php注册审核重点解析(数据访问)
May 23 PHP
Laravel中Facade的加载过程与原理详解
Sep 22 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
关于Laravel参数验证的一些疑与惑
Nov 19 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
安健A254立体声随身听的分析与打磨
2021/03/02 无线电
PHP教程之PHP中shell脚本的使用方法分享
2012/02/23 PHP
php判断IP地址是否在多个IP段内
2020/08/18 PHP
javascript 得到变量类型的函数
2010/05/19 Javascript
JQuery验证jsp页面属性是否为空(实例代码)
2013/11/08 Javascript
js动态控制table的tr、td增加及删除的具体实现
2014/04/30 Javascript
javascript内置对象操作详解
2015/02/04 Javascript
JavaScript中0和&quot;&quot;比较引发的问题
2016/05/26 Javascript
微信小程序-小说阅读小程序实例(demo)
2017/01/12 Javascript
javascript html5轻松实现拖动功能
2017/03/01 Javascript
H5上传本地图片并预览功能
2017/05/08 Javascript
BootStrap的两种模态框方式
2017/05/10 Javascript
阿里大于短信验证码node koa2的实现代码(最新)
2017/09/07 Javascript
vue-router3.0版本中 router.push 不能刷新页面的问题
2018/05/10 Javascript
jQuery实现常见的隐藏与展示列表效果示例
2018/06/04 jQuery
vue中v-for通过动态绑定class实现触发效果
2018/12/06 Javascript
vue-cli+webpack项目打包到服务器后,ttf字体找不到的解决操作
2020/08/28 Javascript
小程序实现密码输入框
2020/11/16 Javascript
antd table按表格里的日期去排序操作
2020/11/17 Javascript
[42:04]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第一局
2016/03/03 DOTA
python字典排序实例详解
2015/05/20 Python
python numpy函数中的linspace创建等差数列详解
2017/10/13 Python
使用 Python 实现文件递归遍历的三种方式
2018/07/18 Python
Python延时操作实现方法示例
2018/08/14 Python
python 输入一个数n,求n个数求乘或求和的实例
2018/11/13 Python
Woods官网:加拿大最古老、最受尊敬的户外品牌之一
2020/09/12 全球购物
请编写一个 C 函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值
2014/09/15 面试题
机电专业体育教师求职信
2013/09/21 职场文书
简历中的自我评价范文
2014/02/05 职场文书
致200米运动员广播稿
2014/02/06 职场文书
信息技术教学反思
2014/02/12 职场文书
个人收入证明模板
2014/09/18 职场文书
第二批党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
常务副县长“三严三实”对照检查材料思想汇报
2014/10/05 职场文书
初中班干部工作总结
2015/08/10 职场文书
Java日常练习题,每天进步一点点(38)
2021/07/26 Java/Android