PHP如何根据文件头检测文件类型实例代码


Posted in PHP onOctober 14, 2018

前言

什么是文件头部Bom? 说白了,就是在保存文件的时候,文件前面会多出一串隐藏的字符,文件签名一般都在文件的头部,如果你用十六进制方式查看文件,你就可以看到文件的一些签名信息。如用uestudio以十六进制方式查看zip格式的文件,其文件内容头部有50 4B 03 04这样的十六进制信息。同理jpg文件状况有FF D8 FF E0 xx xx 4A 46这样的十六进制信息,其实这此十六进制都是表示一些特殊字条。

php怎么样验证文件类型?

先来看一个简单的方法:

<?php
function checkFileType($fileName){ 
  $file = fopen($fileName, "rb"); 
  $bin = fread($file, 2); //只读2字节 
  fclose($file); 
 // C为无符号整数,网上搜到的都是c,为有符号整数,这样会产生负数判断不正常
  $strInfo = @unpack("C2chars", $bin);
  $typeCode = intval($strInfo['chars1'].$strInfo['chars2']); 
  $fileType = ''; 

 switch( $typeCode )
 {
 case '255216':
 return $typeCode. ' : ' .'jpg';
 break;
 case '7173':
 return $typeCode. ' : ' .'gif';
 break;
 case '13780':
 return $typeCode. ' : ' .'png';
 break;
 case '6677':
 return $typeCode. ' : ' .'bmp';
 break;
 case '7790':
 return $typeCode. ' : ' .'exe';
 break;
 case '7784':
 return $typeCode. ' : ' .'midi';
 break;
 case '8297':
 return $typeCode. ' : ' .'rar';
 break;
 default:
 return $typeCode. ' : ' .'Unknown';
 break;
 }
 //return $typeCode;
 }

$file_name = '11.doc';
echo checkFileType($file_name);

下来提供一个类的实现:

<?php
/*通过文件名,获得文件类型*
 *@author chengmo QQ:8292669*
 *@copyright <a href="http://www.cnblogs.com/chengmo">http://www.cnblogs.com/chengmo</a> 2010-10-17
 *@version 0.1
 *$filename="d:/1.png";echo cFileTypeCheck::getFileType($filename); 打印:png
 */
class cFileTypeCheck
{
  private static $_TypeList=array();
  private static $CheckClass=null;
  private function __construct($filename)
  {
    self::$_TypeList=$this->getTypeList();
  }

  /**
   *处理文件类型映射关系表*
   *
   * @param string $filename 文件类型
   * @return string 文件类型,没有找到返回:other
   */
  private function _getFileType($filename)
  {
    $filetype="other";
    if(!file_exists($filename)) throw new Exception("no found file!");
    $file = @fopen($filename,"rb");
    if(!$file) throw new Exception("file refuse!");
    $bin = fread($file, 15); //只读15字节 各个不同文件类型,头信息不一样。
    fclose($file);

    $typelist=self::$_TypeList;
    foreach ($typelist as $v)
    {
      $blen=strlen(pack("H*",$v[0])); //得到文件头标记字节数
      $tbin=substr($bin,0,intval($blen)); ///需要比较文件头长度

      if(strtolower($v[0])==strtolower(array_shift(unpack("H*",$tbin))))
      {
        return $v[1];
      }
    }
    return $filetype;
  }

  /**
   *得到文件头与文件类型映射表*
   *
   * @return array array(array('key',value)...)
   */
  public function getTypeList()
  {
    return array(array("FFD8FFE1","jpg"),
    array("89504E47","png"),
    array("47494638","gif"),
    array("49492A00","tif"),
    array("424D","bmp"),
    array("41433130","dwg"),
    array("38425053","psd"),
    array("7B5C727466","rtf"),
    array("3C3F786D6C","xml"),
    array("68746D6C3E","html"),
    array("44656C69766572792D646174","eml"),
    array("CFAD12FEC5FD746F","dbx"),
    array("2142444E","pst"),
    array("D0CF11E0","xls/doc"),
    array("5374616E64617264204A","mdb"),
    array("FF575043","wpd"),
    array("252150532D41646F6265","eps/ps"),
    array("255044462D312E","pdf"),
    array("E3828596","pwl"),
    array("504B0304","zip"),
    array("52617221","rar"),
    array("57415645","wav"),
    array("41564920","avi"),
    array("2E7261FD","ram"),
    array("2E524D46","rm"),
    array("000001BA","mpg"),
    array("000001B3","mpg"),
    array("6D6F6F76","mov"),
    array("3026B2758E66CF11","asf"),
    array("4D546864","mid"));
  }


  public static function getFileType($filename)
  {
    if(!self::$CheckClass) self::$CheckClass=new self($filename);
    $class=self::$CheckClass;
    return $class->_getFileType($filename);
  }

}

$filename="22.jpg";
echo $filename,"t",cFileTypeCheck::getFileType($filename),"rn";
$filename="11.doc";
echo $filename,"t",cFileTypeCheck::getFileType($filename),"rn";

或者可以这么检测:

<?php
$filename = '22.jpg';

$extname = strtolower(substr($filename, strrpos($filename, '.') + 1));
echo $extname.'<br />';
$file = @fopen($filename, 'rb');
  if ($file)
  {
    $str = @fread($file, 0x400); // 读取前 1024 个字节
 echo substr($str, 0, 4);
    @fclose($file);
  }
 if (substr($str, 0, 4) == 'MThd' && $extname != 'txt')
    {
      $format = 'mid';
    }
    elseif (substr($str, 0, 4) == 'RIFF' && $extname == 'wav')
    {
      $format = 'wav';
    }
    elseif (substr($str ,0, 3) == "/xFF/xD8/xFF")
    {
      $format = 'jpg';
    }
    elseif (substr($str ,0, 4) == 'GIF8' && $extname != 'txt')
    {
      $format = 'gif';
    }
    elseif (substr($str ,0, 8 ) == "/x89/x50/x4E/x47/x0D/x0A/x1A/x0A")
    {
      $format = 'png';
    }
    elseif (substr($str ,0, 2) == 'BM' && $extname != 'txt')
    {
      $format = 'bmp';
    }
    elseif ((substr($str ,0, 3) == 'CWS' || substr($str ,0, 3) == 'FWS') && $extname != 'txt')
    {
      $format = 'swf';
    }
    elseif (substr($str ,0, 4) == "/xD0/xCF/x11/xE0")
    {  // D0CF11E == DOCFILE == Microsoft Office Document
      if (substr($str,0x200,4) == "/xEC/xA5/xC1/x00" || $extname == 'doc')
      {
        $format = 'doc';
      }
      elseif (substr($str,0x200,2) == "/x09/x08" || $extname == 'xls')
      {
        $format = 'xls';
      } elseif (substr($str,0x200,4) == "/xFD/xFF/xFF/xFF" || $extname == 'ppt')
      {
        $format = 'ppt';
      }
    } elseif (substr($str ,0, 4) == "PK/x03/x04")
    {
      $format = 'zip';
    } elseif (substr($str ,0, 4) == 'Rar!' && $extname != 'txt')
    {
      $format = 'rar';
    } elseif (substr($str ,0, 4) == "/x25PDF")
    {
      $format = 'pdf';
    } elseif (substr($str ,0, 3) == "/x30/x82/x0A")
    {
      $format = 'cert';
    } elseif (substr($str ,0, 4) == 'ITSF' && $extname != 'txt')
    {
      $format = 'chm';
    } elseif (substr($str ,0, 4) == "/x2ERMF")
    {
      $format = 'rm';
    } elseif ($extname == 'sql')
    {
      $format = 'sql';
    } elseif ($extname == 'txt')
    {
      $format = 'txt';
    }

 echo $format;

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
黑夜路人出的几道php笔试题
Aug 04 PHP
php学习笔记 类的声明与对象实例化
Jun 13 PHP
thinkphp文件处理类Dir.class.php的用法分析
Dec 08 PHP
php使用mysqli向数据库添加数据的方法
Mar 20 PHP
在php和MySql中计算时间差的方法详解
Mar 27 PHP
PHP自定义多进制的方法
Nov 03 PHP
php获取linux命令结果的实例
Mar 13 PHP
Yii2框架中使用PHPExcel导出Excel文件的示例
Aug 09 PHP
Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
Sep 20 PHP
PHP实现求两个字符串最长公共子串的方法示例
Nov 17 PHP
php实现的生成迷宫与迷宫寻址算法完整实例
Nov 06 PHP
PHP实现的策略模式示例
Mar 20 PHP
PHP5.0 TIDY_PARSE_FILE缓冲区溢出漏洞的解决方案
Oct 14 #PHP
PHP按一定比例压缩图片的方法
Oct 12 #PHP
PHP实现图片压缩
Sep 09 #PHP
PHP获取数据库表中的数据插入新的表再原删除数据方法
Oct 12 #PHP
thinkphp5.0整合phpsocketio完整攻略(绕坑)
Oct 12 #PHP
PHP解析url并得到url参数方法总结
Oct 11 #PHP
详细对比php中类继承和接口继承
Oct 11 #PHP
You might like
基于mysql的论坛(4)
2006/10/09 PHP
PHP 使用header函数设置HTTP头的示例解析 表头
2013/06/17 PHP
PHP四种基本排序算法示例
2015/04/09 PHP
PHP性能分析工具XHProf安装使用教程
2015/05/13 PHP
php计算税后工资的方法
2015/07/28 PHP
采用CSS和JS,刚好我最近有个站点要用到下拉菜单!
2006/06/26 Javascript
jquery焦点图片切换(数字标注/手动/自动播放/横向滚动)
2013/01/24 Javascript
用console.table()调试javascript
2014/09/04 Javascript
Jquery Easyui进度条组件Progress使用详解(8)
2020/03/26 Javascript
js oncontextmenu事件使用详解
2017/03/25 Javascript
Nodejs+express+ejs简单使用实例代码
2017/09/18 NodeJs
Vuex 入门教程
2018/01/10 Javascript
5分钟学会Vue动画效果(小结)
2018/07/21 Javascript
详解ES6中的 Set Map 数据结构学习总结
2018/11/06 Javascript
详解Vue 动态组件与全局事件绑定总结
2018/11/11 Javascript
jQuery提示框插件SweetAlert用法分析
2019/08/05 jQuery
VueCli4项目配置反向代理proxy的方法步骤
2020/05/17 Javascript
JS实现网站楼层导航效果代码实例
2020/06/16 Javascript
Python实现读取并保存文件的类
2017/05/11 Python
Python获取当前函数名称方法实例分享
2018/01/18 Python
Python实现简单生成验证码功能【基于random模块】
2018/02/10 Python
python中logging包的使用总结
2018/02/28 Python
在python plt图表中文字大小调节的方法
2019/07/08 Python
python把ipynb文件转换成pdf文件过程详解
2019/07/09 Python
解决numpy矩阵相减出现的负值自动转正值的问题
2020/06/03 Python
webapp字号大小跟随系统字号大小缩放的示例代码
2018/12/26 HTML / CSS
Html5原生拖拽相关事件简介以及基础实现
2020/11/19 HTML / CSS
美国室内和室外装饰花盆购物网站:ePlanters
2019/03/22 全球购物
美国林业供应商:Forestry Suppliers
2019/05/01 全球购物
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
运动会入场解说词300字
2014/01/25 职场文书
我爱祖国演讲稿
2014/09/02 职场文书
三方协议书
2015/01/27 职场文书
研究生简历自我评
2015/03/11 职场文书
《童年》读后感(三篇)
2019/08/27 职场文书
MySQL高速缓存启动方法及参数详解(query_cache_size)
2021/07/01 MySQL