·您当前的位置:首页 > 技术教程 > PHP教程 >

[PHP]PHP程序基于文件头信息判断文件的类型

时间:2014-07-20 20:27酷播
文件签名一般都在文件的头部,如果你用十六进制方式查看文件,你就可以看到文件的一些签名信息

    文件签名一般都在文件的头部,如果你用十六进制方式查看文件,你就可以看到文件的一些签名信息。如用UltraEdit以十六进制方式查看zip格式的文 件,其文件内容头部有50 4B 03 04这样的十六进制信息。同理jpg文件状况有FF D8 FF E0 xx xx 4A 46这样的十六进制信息,其实这此十六进制都是表示一些特殊字条。

php怎么样验证文件类型?通过上述信息我们可以用文件头信息来准确的判断文件类型。

先来看一个简单的方法:

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

下来提供一个类的实现:

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

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器