设为首页 收藏本站
查看: 816|回复: 0

[经验分享] php通过文件头检测文件类型通用类(zip,rar…)_转

[复制链接]

尚未签到

发表于 2017-4-13 08:31:24 | 显示全部楼层 |阅读模式
http://www.cnblogs.com/chengmo/archive/2010/10/17/1853710.html





php通过文件头检测文件类型通用类(zip,rar…)
  在做web应用时候,通过web扩展名判断上存文件类型,这个是我们常使用的。有时候我们这样做还不完善。可能有些人上存一些文件,但是他通过修改扩展名,让在我们的文件类型之内。 单实际访问时候又不能展示(因为扩展名与文件内容不符)。下面这个php类,可能能够给我们带来帮助。
  一、php检测类
   
  首先说明下,上面文件头与文件类型映射关系来自网上,如果你有新的文件需要检查,只需要将映射加入即可。 如果你需要知道文件头信息,可以通过工具:winhex打开标准文件查找。如:
  代码:
view sourceprint?

01<?php

02 

03/*通过文件名,获得文件类型*

04 *@author chengmo QQ:8292669*

05 *@copyright <a href="http://www.cnblogs.com/chengmo">http://www.cnblogs.com/chengmo</a> 2010-10-17

06 *@version 0.1

07 *$filename="d:/1.png";echo cFileTypeCheck::getFileType($filename); 打印:png

08 */

09classcFileTypeCheck

10{

11    privatestatic$_TypeList=array();

12    privatestatic$CheckClass=null;

13    privatefunction__construct($filename)

14    {

15        self::$_TypeList=$this->getTypeList();

16    }

17 

18    /**

19     *处理文件类型映射关系表*

20     *

21     * @param string $filename 文件类型

22     * @return string 文件类型,没有找到返回:other

23     */

24    privatefunction_getFileType($filename)

25    {

26        $filetype="other";

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字节 各个不同文件类型,头信息不一样。

31        fclose($file);

32         

33        $typelist=self::$_TypeList;

34        foreach($typelistas$v)

35        {

36            $blen=strlen(pack("H*",$v[0])); //得到文件头标记字节数

37            $tbin=substr($bin,0,intval($blen)); ///需要比较文件头长度

38             

39            if(strtolower($v[0])==strtolower(array_shift(unpack("H*",$tbin))))

40            {

41                return$v[1];

42            }

43        }

44        return$filetype;

45    }

46     

47    /**

48     *得到文件头与文件类型映射表*

49     *

50     * @return array array(array('key',value)...)

51     */

52    publicfunctiongetTypeList()

53    {

54        returnarray(array("FFD8FFE1","jpg"),

55        array("89504E47","png"),

56        array("47494638","gif"),

57        array("49492A00","tif"),

58        array("424D","bmp"),

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"));

84    }

85 

86    publicstaticfunction   getFileType($filename)

87    {

88        if(!self::$CheckClass) self::$CheckClass=newself($filename);

89        $class=self::$CheckClass;

90        return$class->_getFileType($filename);

91    }

92}



  怎么样获得头字节码:
DSC0000.png

  可以看到: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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-364177-1-1.html 上篇帖子: 回应拐拐龙底咚兄弟关于ROR,PHP,Web应用开发 下篇帖子: 使用PHP的SESSION直接保存对象需要注意隐含的序列化
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表