`

php通过文件头检测文件类型通用类(zip,rar…)_转

    博客分类:
  • php
阅读更多


在做web应用时候,通过web扩展名判断上存文件类型,这个是我们常使用的。有时候我们这样做还不完善。可能有些人上存一些文件,但是他通过 修改扩展名,让在我们的文件类型之内。 单实际访问时候又不能展示(因为扩展名与文件内容不符)。下面这个php类,可能能够给我们带来帮助。

 

一、php检测类

 

 

首先说明下,上面文件头与文件类型映射关系来自网上,如果你有新的文件需要检查,只需要将映射加入即可。 如果你需要知道文件头信息,可以通过工具:winhex打开标准文件查找。如:

代码:

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   */
09 class cFileTypeCheck
10 {
11      private static $_TypeList = array ();
12      private static $CheckClass =null;
13      private function __construct( $filename )
14      {
15          self:: $_TypeList = $this ->getTypeList();
16      }
17  
18      /**
19       *处理文件类型映射关系表*
20       *
21       * @param string $filename 文件类型
22       * @return string 文件类型,没有找到返回:other
23       */
24      private function _getFileType( $filename )
25      {
26          $filetype = "other" ;
27          if (! file_exists ( $filename )) throw new Exception( "no found file!" );
28          $file = @ fopen ( $filename , "rb" );
29          if (! $file ) throw new Exception( "file refuse!" );
30          $bin = fread ( $file , 15); //只读15字节 各个不同文件类型,头信息不一样。
31          fclose( $file );
32           
33          $typelist =self:: $_TypeList ;
34          foreach ( $typelist as $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      public function getTypeList()
53      {
54          return array ( 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      public static function    getFileType( $filename )
87      {
88          if (!self:: $CheckClass ) self:: $CheckClass = new self( $filename );
89          $class =self:: $CheckClass ;
90          return $class ->_getFileType( $filename );
91      }
92 }

怎么样获得头字节码:

 

image

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

分享到:
评论

相关推荐

    php通过文件头检测文件类型通用代码类(zip,rar等)

    通过上述知识点,可以得知如何使用文件头信息在PHP中检测文件类型,并且可以实现一个通用的文件类型检测代码类,这个类可以在Web应用中充当安全检查的一个环节,防止恶意文件上传带来的潜在风险。

    rar转zip v1.0.rar

    RAR和ZIP都是常见的压缩格式,但它们在压缩算法、支持的功能以及文件头结构上有所不同。RAR通常提供更好的压缩比,而ZIP则更通用且在各种操作系统中都有内置支持。 描述中提到的“将rar格式转为zip格式”,这通常...

    3162非常简洁时尚的html5模板5588_企业网站模板PHP整站源码.zip.rar

    该资源是一个包含企业网站模板的压缩包,名为"3162非常简洁时尚的html5模板5588_企业网站模板PHP整站源码.zip.rar",它使用了HTML5技术并集成了PHP编程语言,适用于创建现代化、简洁且时尚的企业网站。以下是基于这...

    thinkphp压缩打包.rar

    在描述中提到的文件压缩功能,是通过 PHP 内置的 ZipArchive 类实现的。ZipArchive 提供了一系列方法来创建、打开、修改和提取 ZIP 文件。例如,`createFromString()` 可以将字符串压缩为 ZIP 文件,`addFile()` ...

    4362蓝色宽屏响应式太阳眼镜网上商城整站模板5296_企业网站模板PHP整站源码.zip.rar

    4. **tools**:工具类文件夹,可能包含一些通用的辅助函数,如加密解密、日期时间处理等。 5. **index**:网站的主页,可能包含欢迎页面、商品展示、导航栏等元素。 6. **logout.php**:用户登出功能的实现,清除...

    PHP版本学生管理系统.rar

    在“PHP版本学生管理系统”的压缩包中,包含的“学生管理系统.zip”文件很可能是系统的源代码和相关资源。解压后,我们可以看到项目结构,通常包括以下几个部分: - index.php:主页面,用于用户登录和导航。 - ...

    3171粉色简洁服装模特写真公司网站模板4914_企业网站模板PHP整站源码.zip.rar

    10. **包含文件 (includes)**: 这个文件夹通常包含一些经常被其他文件引用的通用代码片段,如头部和尾部的HTML、CSS链接、JavaScript文件等,有利于代码复用和维护。 11. **链接文件 (雪云网络.url)**: 这可能是一...

    java开源包1

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    php 根据URL下载远程图片、压缩包、pdf等文件到本地

    本示例主要讲解如何利用cURL实现这一功能,包括图片、压缩包(RAR和ZIP)以及PDF文件的下载。 1. **基本下载流程** 下载远程文件的核心思路是通过HTTP请求获取文件内容,然后将其保存到本地。以下是一个通用的下载...

    3174粉色恋爱交友展示企业网站模板5011_企业网站模板PHP整站源码.zip.rar

    8. **includes**:包含文件夹,这里通常存放着被多个页面引用的通用函数库、头部和尾部模板等。 9. **menu**:菜单系统,负责生成网站导航,确保用户能够方便地浏览各个部分。 10. **api**:API接口文件,可能用于...

    java开源包11

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包2

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包3

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包6

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包5

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包10

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包4

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包8

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

    java开源包7

    AutoTips是为解决应用系统对于【自动提示】的需要(如:Google搜索), 而开发的架构无关的公共控件, 以满足该类需求可以通过快速配置来开发。AutoTips基于搜索引擎Apache Lucene实现。AutoTips提供统一UI。 WAP浏览器...

Global site tag (gtag.js) - Google Analytics