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


Posted in PHP onOctober 19, 2010

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

<?php 
/*通过文件名,获得文件类型* 
*@author chengmo* 
*@copyright cnblog.com/chengmo 2010-10-17 
*@version 0.1 
*$filename="d:/1.png";echo cFileTypeCheck::getFileType($filename); 打印:png 
*/ 
class cFileTypeCheck 
{ 
private static $_TypeList=array(); 
private static $CheckClass=null; 
private function __construct($filename) 
{ 
self::$_TypeList=$this->getTypeList(); 
} 
/** 
*处理文件类型映射关系表* 
* 
* @param string $filename 文件类型 
* @return string 文件类型,没有找到返回:other 
*/ 
private function _getFileType($filename) 
{ 
$filetype="other"; 
if(!file_exists($filename)) throw new Exception("no found file!"); 
$file = @fopen($filename,"rb"); 
if(!$file) throw new Exception("file refuse!"); 
$bin = fread($file, 15); //只读15字节 各个不同文件类型,头信息不一样。 
fclose($file); 
$typelist=self::$_TypeList; 
foreach ($typelist as $v) 
{ 
$blen=strlen(pack("H*",$v[0])); //得到文件头标记字节数 
$tbin=substr($bin,0,intval($blen)); ///需要比较文件头长度 
if(strtolower($v[0])==strtolower(array_shift(unpack("H*",$tbin)))) 
{ 
return $v[1]; 
} 
} 
return $filetype; 
} 
/** 
*得到文件头与文件类型映射表* 
* 
* @return array array(array('key',value)...) 
*/ 
public function getTypeList() 
{ 
return array(array("FFD8FFE1","jpg"), 
array("89504E47","png"), 
array("47494638","gif"), 
array("49492A00","tif"), 
array("424D","bmp"), 
array("41433130","dwg"), 
array("38425053","psd"), 
array("7B5C727466","rtf"), 
array("3C3F786D6C","xml"), 
array("68746D6C3E","html"), 
array("44656C69766572792D646174","eml"), 
array("CFAD12FEC5FD746F","dbx"), 
array("2142444E","pst"), 
array("D0CF11E0","xls/doc"), 
array("5374616E64617264204A","mdb"), 
array("FF575043","wpd"), 
array("252150532D41646F6265","eps/ps"), 
array("255044462D312E","pdf"), 
array("E3828596","pwl"), 
array("504B0304","zip"), 
array("52617221","rar"), 
array("57415645","wav"), 
array("41564920","avi"), 
array("2E7261FD","ram"), 
array("2E524D46","rm"), 
array("000001BA","mpg"), 
array("000001B3","mpg"), 
array("6D6F6F76","mov"), 
array("3026B2758E66CF11","asf"), 
array("4D546864","mid")); 
} 
public static function getFileType($filename) 
{ 
if(!self::$CheckClass) self::$CheckClass=new self($filename); 
$class=self::$CheckClass; 
return $class->_getFileType($filename); 
} 
}

怎么样获得头字节码:
php通过文件头检测文件类型通用代码类(zip,rar等)
可以看到: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 相关文章推荐
优化NFR之一 --MSSQL Hello Buffer Overflow
Oct 09 PHP
PHP高级OOP技术演示
Aug 27 PHP
php 仿Comsenz安装效果代码打包提供下载
May 09 PHP
php运行出现Call to undefined function curl_init()的解决方法
Nov 02 PHP
PHP项目开发中最常用的自定义函数整理
Dec 02 PHP
php中url传递中文字符,特殊危险字符的解决方法
Aug 17 PHP
PHP zip扩展Linux下安装过程分享
May 05 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
Nov 18 PHP
PHP全局变量与超级全局变量区别分析
Apr 01 PHP
解决yii2左侧菜单子级无法高亮问题的方法
May 08 PHP
PHP实现截取中文字符串不出现?号的解决方法
Dec 29 PHP
PHP解耦的三重境界(浅谈服务容器)
Mar 13 PHP
php empty,isset,is_null判断比较(差异与异同)
Oct 19 #PHP
学习php笔记 字符串处理
Oct 19 #PHP
PHP 函数执行效率的小比较
Oct 17 #PHP
PHP类中Static方法效率测试代码
Oct 17 #PHP
发款php蜘蛛统计插件只要有mysql就可用
Oct 12 #PHP
PHP 的ArrayAccess接口 像数组一样来访问你的PHP对象
Oct 12 #PHP
php中去除所有js,html,css代码
Oct 12 #PHP
You might like
隐性调用php程序的方法
2015/06/13 PHP
PHP中empty,isset,is_null用法和区别
2017/02/19 PHP
PHP操作XML中XPath的应用示例
2019/07/04 PHP
js调用flash的效果代码
2008/04/26 Javascript
jQuery.autocomplete 支持中文输入(firefox)修正方法
2011/03/10 Javascript
基于JQuery实现的Select级联
2014/01/27 Javascript
简单的js图片轮换代码(js图片轮播)
2014/05/06 Javascript
JavaScript实现将UPC转换成ISBN的方法
2015/05/26 Javascript
js事件源window.event.srcElement兼容性写法(详解)
2016/11/25 Javascript
基于BootStrap与jQuery.validate实现表单提交校验功能
2016/12/22 Javascript
webpack4 CSS Tree Shaking的使用
2018/09/03 Javascript
详解Vue前端对axios的封装和使用
2019/04/01 Javascript
javascript 构建模块化开发过程解析
2019/09/11 Javascript
[03:46]DAC趣味视频-中文考试.mp4
2017/04/02 DOTA
python抓取某汽车网数据解析html存入excel示例
2013/12/04 Python
在Python中使用dict和set方法的教程
2015/04/27 Python
python修改操作系统时间的方法
2015/05/18 Python
Python 提取dict转换为xml/json/table并输出的实现代码
2016/08/28 Python
浅谈flask源码之请求过程
2018/07/26 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
2018/07/27 Python
python2与python3爬虫中get与post对比解析
2019/09/18 Python
python os.path.isfile()因参数问题判断错误的解决
2019/11/29 Python
Python @property装饰器原理解析
2020/01/22 Python
tensorflow通过模型文件,使用tensorboard查看其模型图Graph方式
2020/01/23 Python
python连接mysql有哪些方法
2020/06/24 Python
获取邓白氏信用报告:Dun & Bradstreet
2019/01/22 全球购物
Flesh Beauty官网:露华浓集团旗下彩妆品牌
2021/02/15 全球购物
.NET里面什么时候需要调用垃圾回收
2015/06/01 面试题
安全生产宣传标语
2014/06/06 职场文书
教师思想作风整顿个人剖析材料
2014/10/10 职场文书
2014年销售部工作总结
2014/12/01 职场文书
先进党组织事迹材料
2014/12/26 职场文书
贫困生助学金感谢信
2015/01/21 职场文书
人力资源部岗位职责
2015/02/11 职场文书
会计专业2019暑假实习报告
2019/06/21 职场文书
教你如何使用Python实现二叉树结构及三种遍历
2021/06/18 Python