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 GD绘制24小时柱状图
Jun 28 PHP
php中防止伪造跨站请求的小招式
Sep 02 PHP
PHP函数microtime()用法与说明
Dec 04 PHP
PHP实现图片旋转效果实例代码
Oct 01 PHP
浅析php原型模式
Nov 25 PHP
Yii分页用法实例详解
Dec 04 PHP
PHP 正则表达式小结
Feb 12 PHP
php简单实现多字节字符串翻转的方法
Mar 31 PHP
thinkphp框架实现数据添加和显示功能
Jun 29 PHP
学习PHP Cookie处理函数
Aug 09 PHP
实例讲解PHP中使用命名空间
Jan 27 PHP
Yii 实现数据加密和解密
Mar 09 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
Smarty+QUICKFORM小小演示
2007/02/25 PHP
巧用php中的array_filter()函数去掉多维空值的代码分享
2012/09/07 PHP
php中explode与split的区别介绍
2012/10/03 PHP
PHP使用CURL_MULTI实现多线程采集的例子
2014/07/29 PHP
jquery HotKeys轻松搞定键盘事件代码
2008/08/30 Javascript
jQuery 注意事项 与原因分析
2009/04/24 Javascript
基于jquery实现图片广告轮换效果代码
2011/07/07 Javascript
浅谈Javascript中深复制
2014/12/01 Javascript
JQuery select(下拉框)操作方法汇总
2015/04/15 Javascript
javascript返回顶部的按钮实现方法
2016/01/09 Javascript
Javascript简写条件语句(推荐)
2016/06/12 Javascript
BootStrap树状图显示功能
2016/11/24 Javascript
jquery实现表单获取短信验证码代码
2017/03/13 Javascript
Django1.7+JQuery+Ajax验证用户注册集成小例子
2017/04/08 jQuery
强大的JavaScript响应式图表Chartist.js的使用
2017/09/13 Javascript
js精确的加减乘除实例
2017/11/14 Javascript
javascript实现计算指定范围内的质数示例
2018/12/29 Javascript
Vue+Express实现登录状态权限验证的示例代码
2019/05/05 Javascript
vue+canvas实现拼图小游戏
2020/09/18 Javascript
Python学习小技巧之列表项的推导式与过滤操作
2017/05/20 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
2020/03/06 Python
使用Jupyter notebooks上传文件夹或大量数据到服务器
2020/04/14 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
python中如何打包用户自定义模块
2020/09/23 Python
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
html5 canvas绘制矩形和圆形的实例代码
2016/06/16 HTML / CSS
戴尔美国官网:Dell
2016/08/31 全球购物
英国家居用品和家居装饰品购物网站:Cox & Cox
2019/08/25 全球购物
施工单位安全责任书
2014/07/24 职场文书
酒店总经理岗位职责范本
2014/08/08 职场文书
普通党员对照检查材料
2014/08/28 职场文书
个人委托书范本汇总
2014/10/01 职场文书
初中数学教学随笔
2015/08/15 职场文书
校园广播稿范文
2015/08/19 职场文书
《夜莺的歌声》教学反思
2016/02/22 职场文书
简单聊聊Vue中的计算属性和属性侦听
2021/10/05 Vue.js