当前位置:首页 > PHP教程 > php文件操作 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-10-31 14:12:08 浏览: 评论:0 

这篇文章主要给大家介绍了关于PHP如何根据文件头检测文件类型的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用php具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。

前言

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

php怎么样验证文件类型?

先来看一个简单的方法:

  1. <?php 
  2. function checkFileType($fileName){  
  3.   $file = fopen($fileName"rb");  
  4.   $bin = fread($file, 2); //只读2字节  
  5.   fclose($file);  
  6.  // C为无符号整数,网上搜到的都是c,为有符号整数,这样会产生负数判断不正常 
  7.   $strInfo = @unpack("C2chars"$bin); 
  8.   $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);  
  9.   $fileType = '';  
  10.  
  11.  switch$typeCode ) 
  12.  { 
  13.  case '255216'
  14.  return $typeCode' : ' .'jpg'
  15.  break
  16.  case '7173'
  17.  return $typeCode' : ' .'gif'
  18.  break
  19.  case '13780'
  20.  return $typeCode' : ' .'png'
  21.  break
  22.  case '6677'
  23.  return $typeCode' : ' .'bmp'
  24.  break
  25.  case '7790'
  26.  return $typeCode' : ' .'exe'
  27.  break
  28.  case '7784'
  29.  return $typeCode' : ' .'midi'
  30.  break
  31.  case '8297'
  32.  return $typeCode' : ' .'rar'
  33.  break
  34.  default
  35.  return $typeCode' : ' .'Unknown'
  36.  break
  37.  } 
  38.  //return $typeCode; 
  39.  } 
  40.  
  41. $file_name = '11.doc'
  42. echo checkFileType($file_name); 

下来提供一个类的实现:

  1. <?php 
  2. /*通过文件名,获得文件类型* 
  3.  *@author chengmo QQ:8292669* 
  4.  *@copyright <a href="http://www.cnblogs.com/chengmo">http://www.cnblogs.com/chengmo</a> 2010-10-17 
  5.  *@version 0.1 
  6.  *$filename="d:/1.png";echo cFileTypeCheck::getFileType($filename); 打印:png 
  7.  */ 
  8. class cFileTypeCheck 
  9.   private static $_TypeList=array(); 
  10.   private static $CheckClass=null; 
  11.   private function __construct($filename
  12.   { 
  13.     self::$_TypeList=$this->getTypeList(); 
  14.   } 
  15.  
  16.   /** 
  17.    *处理文件类型映射关系表* 
  18.    * 
  19.    * @param string $filename 文件类型 
  20.    * @return string 文件类型,没有找到返回:other 
  21.    */ 
  22.   private function _getFileType($filename
  23.   { 
  24.     $filetype="other"
  25.     if(!file_exists($filename)) throw new Exception("no found file!"); 
  26.     $file = @fopen($filename,"rb"); 
  27.     if(!$filethrow new Exception("file refuse!"); 
  28.     $bin = fread($file, 15); //只读15字节 各个不同文件类型,头信息不一样。 
  29.     fclose($file); 
  30.  
  31.     $typelist=self::$_TypeList
  32.     foreach ($typelist as $v
  33.     { 
  34.       $blen=strlen(pack("H*",$v[0])); //得到文件头标记字节数 
  35.       $tbin=substr($bin,0,intval($blen)); ///需要比较文件头长度 
  36.  
  37.       if(strtolower($v[0])==strtolower(array_shift(unpack("H*",$tbin)))) 
  38.       { 
  39.         return $v[1]; 
  40.       } 
  41.     } 
  42.     return $filetype
  43.   } 
  44.  
  45.   /** 
  46.    *得到文件头与文件类型映射表* 
  47.    * 
  48.    * @return array array(array('key',value)...) 
  49.    */ 
  50.   public function getTypeList() 
  51.   { 
  52.     return array(array("FFD8FFE1","jpg"), 
  53.     array("89504E47","png"), 
  54.     array("47494638","gif"), 
  55.     array("49492A00","tif"), 
  56.     array("424D","bmp"), 
  57.     array("41433130","dwg"), 
  58.     array("38425053","psd"), 
  59.     array("7B5C727466","rtf"), 
  60.     array("3C3F786D6C","xml"), 
  61.     array("68746D6C3E","html"), 
  62.     array("44656C69766572792D646174","eml"), 
  63.     array("CFAD12FEC5FD746F","dbx"), 
  64.     array("2142444E","pst"), 
  65.     array("D0CF11E0","xls/doc"), 
  66.     array("5374616E64617264204A","mdb"), 
  67.     array("FF575043","wpd"), 
  68.     array("252150532D41646F6265","eps/ps"), 
  69.     array("255044462D312E","pdf"), 
  70.     array("E3828596","pwl"), 
  71.     array("504B0304","zip"), 
  72.     array("52617221","rar"), 
  73.     array("57415645","wav"), 
  74.     array("41564920","avi"), 
  75.     array("2E7261FD","ram"), 
  76.     array("2E524D46","rm"), 
  77.     array("000001BA","mpg"), 
  78.     array("000001B3","mpg"), 
  79.     array("6D6F6F76","mov"), 
  80.     array("3026B2758E66CF11","asf"), 
  81.     array("4D546864","mid")); 
  82.   } 
  83.  
  84.  
  85.   public static function getFileType($filename
  86.   { 
  87.     if(!self::$CheckClass) self::$CheckClass=new self($filename); 
  88.     $class=self::$CheckClass
  89.     return $class->_getFileType($filename); 
  90.   } 
  91.  
  92.  
  93. $filename="22.jpg"
  94. echo $filename,"t",cFileTypeCheck::getFileType($filename),"rn"
  95. $filename="11.doc"
  96. echo $filename,"t",cFileTypeCheck::getFileType($filename),"rn"

或者可以这么检测:

  1. <?php 
  2. $filename = '22.jpg'
  3.  
  4. $extname = strtolower(substr($filenamestrrpos($filename'.') + 1)); 
  5. echo $extname.'<br />'
  6. $file = @fopen($filename'rb'); 
  7.   if ($file
  8.   { 
  9.     $str = @fread($file, 0x400); // 读取前 1024 个字节 
  10.  echo substr($str, 0, 4); 
  11.     @fclose($file); 
  12.   } 
  13.  if (substr($str, 0, 4) == 'MThd' && $extname != 'txt'
  14.     { 
  15.       $format = 'mid'
  16.     } 
  17.     elseif (substr($str, 0, 4) == 'RIFF' && $extname == 'wav'
  18.     { 
  19.       $format = 'wav'
  20.     } 
  21.     elseif (substr($str ,0, 3) == "/xFF/xD8/xFF"
  22.     { 
  23.       $format = 'jpg'
  24.     } 
  25.     elseif (substr($str ,0, 4) == 'GIF8' && $extname != 'txt'
  26.     { 
  27.       $format = 'gif'
  28.     } 
  29.     elseif (substr($str ,0, 8 ) == "/x89/x50/x4E/x47/x0D/x0A/x1A/x0A"
  30.     { 
  31.       $format = 'png'
  32.     } 
  33.     elseif (substr($str ,0, 2) == 'BM' && $extname != 'txt'
  34.     { 
  35.       $format = 'bmp'
  36.     } 
  37.     elseif ((substr($str ,0, 3) == 'CWS' || substr($str ,0, 3) == 'FWS') && $extname != 'txt'
  38.     { 
  39.       $format = 'swf'
  40.     } 
  41.     elseif (substr($str ,0, 4) == "/xD0/xCF/x11/xE0"
  42.     {  // D0CF11E == DOCFILE == Microsoft Office Document 
  43.       if (substr($str,0x200,4) == "/xEC/xA5/xC1/x00" || $extname == 'doc'
  44.       { 
  45.         $format = 'doc'
  46.       } 
  47.       elseif (substr($str,0x200,2) == "/x09/x08" || $extname == 'xls'
  48.       { 
  49.         $format = 'xls'
  50.       } elseif (substr($str,0x200,4) == "/xFD/xFF/xFF/xFF" || $extname == 'ppt'
  51.       { 
  52.         $format = 'ppt'
  53.       } 
  54.     } elseif (substr($str ,0, 4) == "PK/x03/x04"
  55.     { 
  56.       $format = 'zip'
  57.     } elseif (substr($str ,0, 4) == 'Rar!' && $extname != 'txt'
  58.     { 
  59.       $format = 'rar'
  60.     } elseif (substr($str ,0, 4) == "/x25PDF"
  61.     { 
  62.       $format = 'pdf'
  63.     } elseif (substr($str ,0, 3) == "/x30/x82/x0A"
  64.     { 
  65.       $format = 'cert'
  66.     } elseif (substr($str ,0, 4) == 'ITSF' && $extname != 'txt'
  67.     { 
  68.       $format = 'chm'
  69.     } elseif (substr($str ,0, 4) == "/x2ERMF"
  70.     { 
  71.       $format = 'rm'
  72.     } elseif ($extname == 'sql'
  73.     { 
  74.       $format = 'sql'
  75.     } elseif ($extname == 'txt'
  76.     { 
  77.       $format = 'txt'
  78.     } 
  79.  
  80.  echo $format;

Tags: PHP文件头检测 PHP检测文件

分享到:

相关文章