|
http://www.cnblogs.com/chengmo/archive/2010/10/17/1853710.html
php通过文件头检测文件类型通用类(zip,rar…)
在做web应用时候,通过web扩展名判断上存文件类型,这个是我们常使用的。有时候我们这样做还不完善。可能有些人上存一些文件,但是他通过修改扩展名,让在我们的文件类型之内。 单实际访问时候又不能展示(因为扩展名与文件内容不符)。下面这个php类,可能能够给我们带来帮助。
一、php检测类
首先说明下,上面文件头与文件类型映射关系来自网上,如果你有新的文件需要检查,只需要将映射加入即可。 如果你需要知道文件头信息,可以通过工具:winhex打开标准文件查找。如:
代码:
view sourceprint?
04 | *@author chengmo QQ:8292669* |
05 | *@copyright <a href="http://www.cnblogs.com/chengmo">http://www.cnblogs.com/chengmo</a> 2010-10-17 |
07 | *$filename="d:/1.png";echo cFileTypeCheck::getFileType($filename); 打印:png |
11 | privatestatic$_TypeList=array(); |
12 | privatestatic$CheckClass=null; |
13 | privatefunction__construct($filename) |
15 | self::$_TypeList=$this->getTypeList(); |
21 | * @param string $filename 文件类型 |
22 | * @return string 文件类型,没有找到返回:other |
24 | privatefunction_getFileType($filename) |
27 | if(!file_exists($filename)) thrownewException("no found file!"); |
28 | $file= @fopen($filename,"rb"); |
29 | if(!$file) thrownewException("file refuse!"); |
30 | $bin= fread($file, 15); //只读15字节 各个不同文件类型,头信息不一样。 |
33 | $typelist=self::$_TypeList; |
34 | foreach($typelistas$v) |
36 | $blen=strlen(pack("H*",$v[0])); //得到文件头标记字节数 |
37 | $tbin=substr($bin,0,intval($blen)); ///需要比较文件头长度 |
39 | if(strtolower($v[0])==strtolower(array_shift(unpack("H*",$tbin)))) |
50 | * @return array array(array('key',value)...) |
52 | publicfunctiongetTypeList() |
54 | returnarray(array("FFD8FFE1","jpg"), |
55 | array("89504E47","png"), |
56 | array("47494638","gif"), |
57 | array("49492A00","tif"), |
59 | array("41433130","dwg"), |
60 | array("38425053","psd"), |
61 | array("7B5C727466","rtf"), |
62 | array("3C3F786D6C","xml"), |
63 | array("68746D6C3E","html"), |
64 | array("44656C69766572792D646174","eml"), |
65 | array("CFAD12FEC5FD746F","dbx"), |
66 | array("2142444E","pst"), |
67 | array("D0CF11E0","xls/doc"), |
68 | array("5374616E64617264204A","mdb"), |
69 | array("FF575043","wpd"), |
70 | array("252150532D41646F6265","eps/ps"), |
71 | array("255044462D312E","pdf"), |
72 | array("E3828596","pwl"), |
73 | array("504B0304","zip"), |
74 | array("52617221","rar"), |
75 | array("57415645","wav"), |
76 | array("41564920","avi"), |
77 | array("2E7261FD","ram"), |
78 | array("2E524D46","rm"), |
79 | array("000001BA","mpg"), |
80 | array("000001B3","mpg"), |
81 | array("6D6F6F76","mov"), |
82 | array("3026B2758E66CF11","asf"), |
83 | array("4D546864","mid")); |
86 | publicstaticfunction getFileType($filename) |
88 | if(!self::$CheckClass) self::$CheckClass=newself($filename); |
89 | $class=self::$CheckClass; |
90 | return$class->_getFileType($filename); |
怎么样获得头字节码:
可以看到:png 文件,头是4个字节(头标记是多少字节需要自己查相关资料确定),对应是:89504E47
如果你对php的pack unpack 不很熟悉,可以查看:
php park、unpark、ord 函数使用方法(二进制流接口应用实例)
调用实例:
$filename="d:/1.png";
echo $filename,"\t",cFileTypeCheck::getFileType($filename),"\r\n";
$filename="d:/test.doc";
echo $filename,"\t",cFileTypeCheck::getFileType($filename),"\r\n";
d:/1.png png
d:/test.doc xls/doc
|
|