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下过滤HTML代码的函数
Dec 10 PHP
PHP 裁剪图片成固定大小代码方法
Sep 09 PHP
php抓取页面与代码解析 推荐
Jul 23 PHP
PHP使用数组实现队列
Feb 05 PHP
php通过两层过滤获取留言内容的方法
Jul 11 PHP
教你在header中隐藏php的版本信息
Aug 10 PHP
PHP常见字符串处理函数用法示例【转换,转义,截取,比较,查找,反转,切割】
Dec 24 PHP
laravel实现批量更新多条记录的方法示例
Oct 22 PHP
php提供实现反射的方法和实例代码
Sep 17 PHP
laravel model模型定义实现开启自动管理时间created_at,updated_at
Oct 17 PHP
PHP架构及原理知识点详解
Dec 22 PHP
通过实例解析PHP数据类型转换方法
Jul 11 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/03/10 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
2015/08/28 PHP
PHP-FPM实现性能优化
2016/03/31 PHP
改善你的jQuery的25个步骤 千倍级效率提升
2010/02/11 Javascript
location.href用法总结(最主要的)
2013/12/27 Javascript
node.js应用后台守护进程管理器Forever安装和使用实例
2014/06/01 Javascript
jquery easyui使用心得
2014/07/07 Javascript
jQuery 处理页面的事件详解
2015/01/20 Javascript
jQuery仿gmail实现fixed布局的方法
2015/05/27 Javascript
jquery动感漂浮导航菜单代码分享
2020/04/15 Javascript
基于vue2实现上拉加载功能
2017/11/28 Javascript
node.js中axios使用心得总结
2017/11/29 Javascript
react router4+redux实现路由权限控制的方法
2018/05/03 Javascript
webpack4 升级迁移的实现
2018/09/12 Javascript
利用Vue构造器创建Form组件的通用解决方法
2018/12/03 Javascript
详解react-refetch的使用小例子
2019/02/15 Javascript
详解基于vue-cli3快速发布一个fullpage组件
2019/03/08 Javascript
JavaScript之数组扁平化详解
2019/06/03 Javascript
JS 自执行函数原理及用法
2019/08/05 Javascript
layui弹出框Tab选项卡的示例代码
2019/09/04 Javascript
vue3+typeScript穿梭框的实现示例
2020/12/29 Vue.js
[04:12]第二届DOTA2亚洲邀请赛选手传记-Newbee.Sccc
2017/04/03 DOTA
Python实现网站文件的全备份和差异备份
2014/11/30 Python
Python IDLE入门简介
2017/12/08 Python
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
2018/04/20 Python
python datetime处理时间小结
2020/04/16 Python
在keras中实现查看其训练loss值
2020/06/16 Python
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
2019/08/01 HTML / CSS
英国太阳镜品牌:Taylor Morris Eyewear
2018/04/18 全球购物
德国购买门票网站:ADticket.de
2019/10/31 全球购物
欧姆龙医疗保健与医疗产品:Omron Healthcare
2020/02/10 全球购物
五十岁生日宴会答谢词
2014/01/15 职场文书
中学感恩教育活动总结
2015/05/05 职场文书
2016年党员干部廉政承诺书
2016/03/24 职场文书
Redis数据结构之链表与字典的使用
2021/05/11 Redis
Python 居然可以在 Excel 中画画你知道吗
2022/02/15 Python