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 相关文章推荐
一个用于网络的工具函数库
Oct 09 PHP
PHP开发过程中常用函数收藏
Dec 14 PHP
php开启安全模式后禁用的函数集合
Jun 26 PHP
thinkphp模板继承实例简述
Nov 26 PHP
Smarty中的注释和截断功能介绍
Apr 09 PHP
php中define用法实例
Jul 30 PHP
PHP利用imagick生成组合缩略图
Feb 19 PHP
Yii2简单实现多语言配置的方法
Jul 23 PHP
微信 getAccessToken方法详解及实例
Nov 23 PHP
php实现通过soap调用.Net的WebService asmx文件
Feb 27 PHP
利用PHP_XLSXWriter代替PHPExcel的方法示例
Jul 16 PHP
php微信开发之关键词回复功能
Jun 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
thinkPHP5框架接口写法简单示例
2019/08/05 PHP
Jquery 实现Tab效果 思路是js思路
2010/03/02 Javascript
js面向对象之公有、私有、静态属性和方法详解
2015/04/17 Javascript
JavaScript手机振动API
2016/06/11 Javascript
nodejs学习笔记之路由
2017/03/27 NodeJs
Vue.js实战之组件的进阶
2017/04/04 Javascript
详解vue父子组件间传值(props)
2017/06/29 Javascript
基于js中的原型(全面讲解)
2017/09/19 Javascript
vue.js给动态绑定的radio列表做批量编辑的方法
2018/02/28 Javascript
详解小程序之简单登录注册表单验证
2019/05/13 Javascript
微信小程序实现圆形进度条动画
2020/11/18 Javascript
javascript面向对象三大特征之多态实例详解
2019/07/24 Javascript
基于vue和bootstrap实现简单留言板功能
2020/05/30 Javascript
Node.js 中判断一个文件是否存在
2020/08/24 Javascript
用Python的Django框架完成视频处理任务的教程
2015/04/02 Python
python简单实现刷新智联简历
2016/03/30 Python
Python 加密的实例详解
2017/10/09 Python
python3+PyQt5+Qt Designer实现扩展对话框
2018/04/20 Python
windows下python安装小白入门教程
2018/09/18 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
2018/12/30 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
2019/03/14 Python
Python的Lambda函数用法详解
2019/09/03 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
2020/03/17 Python
PyTorch加载自己的数据集实例详解
2020/03/18 Python
python列表的逆序遍历实现
2020/04/20 Python
HomeAway英国:全球领先的度假租赁在线市场
2020/02/03 全球购物
一套带答案的C++笔试题
2014/01/10 面试题
定义一结构体数组表示分数,并求两个分数相加之和
2013/06/11 面试题
工商企业管理应届生求职信
2013/11/03 职场文书
优秀幼教自荐信
2014/02/03 职场文书
党风廉设责任书
2014/04/16 职场文书
相亲大会策划方案
2014/06/05 职场文书
2014年纪检部工作总结
2014/11/12 职场文书
员工工作表扬信
2015/05/05 职场文书
面试中canvas绘制图片模糊图片问题处理
2022/03/13 Javascript
让JavaScript代码更加精简的方法技巧
2022/06/01 Javascript