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&amp;&amp;mysql)三
Oct 09 PHP
一周学会PHP(视频)Http下载
Dec 12 PHP
php简单封装了一些常用JS操作
Feb 25 PHP
PHP读取MySQL数据代码
Jun 05 PHP
微盾PHP脚本加密专家php解密算法
Sep 13 PHP
PHP日期处理函数 整型日期格式
Jan 12 PHP
解析PHP自带的进位制之间的转换函数
Jun 08 PHP
Yii调试SQL的常用方法
Jul 09 PHP
php防止sql注入之过滤分页参数实例
Nov 03 PHP
php微信公众平台配置接口开发程序
Sep 22 PHP
thinkPHP5框架实现基于ajax的分页功能示例
Jun 12 PHP
PHP实现抽奖功能实例代码
Jun 30 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小偷程序)
2014/08/23 PHP
php使用google地图应用实例
2014/12/31 PHP
php下Memcached入门实例解析
2015/01/05 PHP
Zend Framework入门教程之Zend_View组件用法示例
2016/12/09 PHP
php批量删除操作代码分享
2017/02/26 PHP
PHP设计模式之观察者模式定义与用法分析
2019/04/04 PHP
JS限制Textarea文本域字符个数的具体实现
2013/08/02 Javascript
nodejs教程之环境安装及运行
2014/11/21 NodeJs
JavaScript使用位运算符判断奇数和偶数的方法
2015/06/01 Javascript
jQuery Easyui学习之datagrid 动态添加、移除editor
2016/01/27 Javascript
JS把内容动态插入到DIV的实现方法
2016/07/19 Javascript
jQuery下拉菜单的实现代码
2016/11/03 Javascript
详解Node.js串行化流程控制
2017/05/04 Javascript
EasyUI框架 使用Ajax提交注册信息的实现代码
2017/09/27 Javascript
vue.js实现只弹一次弹框
2018/01/29 Javascript
jQuery轮播图实例详解
2018/08/15 jQuery
Vue表单绑定的实例代码(单选按钮,选择框(单选时,多选时,用 v-for 渲染的动态选项)
2019/05/13 Javascript
vue实现行列转换的一种方法
2019/08/06 Javascript
layui 动态设置checbox 选中状态的例子
2019/09/02 Javascript
JS实现audio音频剪裁剪切复制播放与上传(步骤详解)
2020/07/28 Javascript
python字典序问题实例
2014/09/26 Python
Python中shutil模块的常用文件操作函数用法示例
2016/07/05 Python
利用Python脚本生成sitemap.xml的实现方法
2017/01/31 Python
Python json模块dumps、loads操作示例
2018/09/06 Python
Python3实现取图片中特定的像素替换指定的颜色示例
2019/01/24 Python
Python日志无延迟实时写入的示例
2019/07/11 Python
python 深度学习中的4种激活函数
2020/09/18 Python
佳能加拿大网上商店:Canon eStore Canada
2018/04/04 全球购物
机械工程师求职自我评价
2013/09/23 职场文书
英语自荐信常用语句
2013/12/13 职场文书
中式婚礼主持词
2014/03/13 职场文书
体育课课后反思
2014/04/24 职场文书
公司股东合作协议书
2014/09/14 职场文书
个人融资协议书范本两则
2014/10/15 职场文书
秦始皇兵马俑导游词
2015/02/02 职场文书
关于antd tree 和父子组件之间的传值问题(react 总结)
2021/06/02 Javascript