当前位置:Gxlcms > PHP教程 > php通过文件头检测文件类型的自定义类

php通过文件头检测文件类型的自定义类

时间:2021-07-01 10:21:17 帮助过:15人阅读

  1. /* 通过文件名,获得文件类型*
  2. * @author chengmo*
  3. * @version 0.1
  4. * $filename="d:/1.png";echo cFileTypeCheck::getFileType($filename); 打印:png
  5. * edit bbs.it-home.org
  6. */
  7. class cFileTypeCheck
  8. {
  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. * @param string $filename 文件类型
  19. * @return string 文件类型,没有找到返回:other
  20. */
  21. private function _getFileType($filename)
  22. {
  23. $filetype="other";
  24. if(!file_exists($filename)) throw new Exception("no found file!");
  25. $file = @fopen($filename,"rb");
  26. if(!$file) throw new Exception("file refuse!");
  27. $bin = fread($file, 15); //只读15字节 各个不同文件类型,头信息不一样。
  28. fclose($file);
  29. $typelist=self::$_TypeList;
  30. foreach ($typelist as $v)
  31. {
  32. $blen=strlen(pack("H*",$v[0])); //得到文件头标记字节数
  33. $tbin=substr($bin,0,intval($blen)); ///需要比较文件头长度
  34. if(strtolower($v[0])==strtolower(array_shift(unpack("H*",$tbin))))
  35. {
  36. return $v[1];
  37. }
  38. }
  39. return $filetype;
  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. public static function getFileType($filename)
  80. {
  81. if(!self::$CheckClass) self::$CheckClass=new self($filename);
  82. $class=self::$CheckClass;
  83. return $class->_getFileType($filename);
  84. }
  85. }
  86. ?>

人气教程排行