服务报价 | 域名主机 | 网络营销 | 软件工具| [加入收藏]
 热线电话: #
当前位置: 主页 > php教程 > php教程 >

php检测文件类型,根据文件header信息

时间:2016-05-08 10:37来源: 作者: 点击:
文章提供一款php检测文件类型,根据文件header信息,他可以根据用户发布的文件头部信息来确实文件的类型,代码如下: ?php /*通过文件名,获得文件类型* *@authorchengmo* *@copyrightcnblog.com/chen

文章提供一款php检测文件类型,根据文件header信息,他可以根据用户发布的文件头部信息来确实文件的类型,代码如下:

  1. <?php  
  2. /*通过文件名,获得文件类型*  
  3. *@author chengmo*  
  4. *@copyright cnblog.com/chengmo 2010-10-17  
  5. *@version 0.1  
  6. *$filename="d:/1.png";echo cfiletypecheck::getfiletype($filename); 打印:png  
  7. */  
  8. class cfiletypecheck  
  9. {  
  10. private static $_typelist=array();  
  11. private static $checkclass=null;  
  12. private function __construct($filename)  
  13. {  
  14. self::$_typelist=$this->gettypelist();  
  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. $typelist=self::$_typelist;  
  31. foreach ($typelist as $v)  
  32. {  
  33. $blen=strlen(pack("h*",$v[0])); //得到文件头标记字节数  
  34. $tbin=substr($bin,0,intval($blen)); ///需要比较文件头长度  
  35. if(strtolower($v[0])==strtolower(array_shift(unpack("h*",$tbin))))  
  36. {  
  37. return $v[1];  
  38. }  
  39. }  
  40. return $filetype;  
  41. }  
  42. /**  
  43. *得到文件头与文件类型映射表*  
  44.  
  45. * @return array array(array('key',value)...)  
  46. */  
  47. public function gettypelist()  
  48. {  
  49. return array(array("ffd8ffe1","jpg"),  
  50. array("89504e47","png"),  
  51. array("47494638","gif"),  
  52. array("49492a00","tif"),  
  53. array("424d","bmp"),  
  54. array("41433130","dwg"),  
  55. array("38425053","ps教程d"),  
  56. array("7b5c727466","rtf"),  
  57. array("3c3f786d6c","xml"),  
  58. array("68746d6c3e","html"),  
  59. array("44656c69766572792d646174","eml"),  
  60. array("cfad12fec5fd746f","dbx"),  
  61. array("2142444e","pst"),  
  62. array("d0cf11e0","xls/doc"),  
  63. array("5374616e64617264204a","mdb"),  
  64. array("ff575043","wpd"),  
  65. array("252150532d41646f6265","eps/ps"),  
  66. array("255044462d312e","pdf"),  
  67. array("e3828596","pwl"),  
  68. array("504b0304","zip"),  
  69. array("52617221","rar"),  
  70. array("57415645","wav"),  
  71. array("41564920","avi"),  
  72. array("2e7261fd","ram"),  
  73. array("2e524d46","rm"),  
  74. array("000001ba","mpg"),  
  75. array("000001b3","mpg"),  
  76. array("6d6f6f76","mov"),  
  77. array("3026b2758e66cf11","asf"),  
  78. array("4d546864","mid"));  
  79. //开源代码最模板zuimoban.com 
  80. public static function getfiletype($filename)  
  81. {  
  82. if(!self::$checkclass) self::$checkclass=new self($filename);  
  83. $class=self::$checkclass;  
  84. return $class->_getfiletype($filename);  
  85. }  
  86. ?> 
  87.  
(责任编辑:最模板)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------