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 相关文章推荐
php数据结构与算法(PHP描述) 查找与二分法查找
Jun 21 PHP
单台服务器的PHP进程之间实现共享内存的方法
Jun 13 PHP
PHP封装分页函数实现文本分页和数字分页
Oct 23 PHP
详解php比较操作符的安全问题
Dec 03 PHP
PHP生成和获取XML格式数据的方法
Mar 04 PHP
PHP中常用的数组操作方法笔记整理
May 16 PHP
PHP将身份证正反面两张照片合成一张图片的代码
Apr 08 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
Apr 20 PHP
php使用环形链表解决约瑟夫问题完整示例
Aug 07 PHP
php如何利用pecl安装mongodb扩展详解
Jan 09 PHP
PHP字符串中抽取子串操作实例分析
Jun 22 PHP
php如何把表单内容提交到数据库
Jul 08 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
找到了一篇jQuery与Prototype并存的冲突的解决方法
2007/08/29 Javascript
使用upstart把nodejs应用封装为系统服务实例
2014/06/01 NodeJs
jQuery中each()方法用法实例
2014/12/27 Javascript
JS验证IP,子网掩码,网关和MAC的方法
2015/07/02 Javascript
jquery自定义插件——window的实现【示例代码】
2016/05/06 Javascript
jQuery  ready方法实现原理详解
2016/10/19 Javascript
Vue入门之animate过渡动画效果
2018/04/08 Javascript
vue项目打包部署到服务器的方法示例
2018/08/27 Javascript
探秘vue-rx 2.0(推荐)
2018/09/21 Javascript
koa源码中promise的解读
2018/11/13 Javascript
jQuery事件绑定和解绑、事件冒泡与阻止事件冒泡及弹出应用示例
2019/05/13 jQuery
详解element-ui级联菜单(城市三级联动菜单)和回显问题
2019/10/02 Javascript
vue-cli脚手架的.babelrc文件用法说明
2020/09/11 Javascript
video.js添加自定义组件的方法
2020/12/09 Javascript
[47:22]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python实现扫描局域网活动ip(扫描在线电脑)
2015/04/28 Python
在Django的视图中使用数据库查询的方法
2015/07/16 Python
Python运算符重载详解及实例代码
2017/03/07 Python
python抽取指定url页面的title方法
2018/05/11 Python
Python3多目标赋值及共享引用注意事项
2019/05/27 Python
python模拟实现斗地主发牌
2020/01/07 Python
django执行数据库查询之后实现返回的结果集转json
2020/03/31 Python
html5 canvas 使用示例
2010/10/22 HTML / CSS
美国南加州的原创极限运动潮牌:Vans(范斯)
2016/08/05 全球购物
快时尚眼镜品牌,全国连锁眼镜店:LOHO眼镜生活
2018/10/08 全球购物
给民警的表扬信
2014/01/08 职场文书
三年级学生评语
2014/04/23 职场文书
销售顾问工作计划书
2014/08/15 职场文书
食堂厨师岗位职责
2014/08/25 职场文书
初二学生评语大全
2014/12/26 职场文书
云冈石窟导游词
2015/02/04 职场文书
幼儿园开学家长寄语(2016秋季)
2015/12/03 职场文书
如何用PHP实现分布算法之一致性哈希算法
2021/05/26 PHP
浅谈如何提高PHP代码质量之单元测试
2021/05/28 PHP
MySQL的InnoDB存储引擎的数据页结构详解
2022/03/03 MySQL
golang连接MySQl使用sqlx库
2022/04/14 Golang