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实现mysql同步的实现方法
Oct 21 PHP
PHP+Mysql+jQuery实现动态展示信息
Oct 08 PHP
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
Nov 21 PHP
dhtmlxTree目录树增加右键菜单以及拖拽排序的实现方法
Apr 26 PHP
如何在smarty中增加类似foreach的功能自动加载数据
Jun 26 PHP
PHP无限分类(树形类)
Sep 28 PHP
Codeigniter生成Excel文档的简单方法
Jun 12 PHP
PHP计算一年多少个星期和每周的开始和结束日期
Jul 01 PHP
ThinkPHP权限认证Auth实例详解
Jul 22 PHP
PHP中常用的字符串格式化函数总结
Nov 19 PHP
php上传大文件设置方法
Apr 14 PHP
在php7中MongoDB实现模糊查询的方法详解
May 03 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 文件上传进度条的两种实现方法的代码
2007/11/25 PHP
ThinkPHP利用PHPMailer实现邮件发送实现代码
2013/09/26 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
jQuery-onload让第一次页面加载时图片是淡入方式显示
2012/05/23 Javascript
对jQuery的事件绑定的一些思考(补充)
2013/04/20 Javascript
利用js实现前台动态添加文本框,后台获取文本框内容(示例代码)
2013/11/25 Javascript
利用js读取动态网站从服务器端返回的数据
2014/02/10 Javascript
用json方式实现在 js 中建立一个map
2014/05/02 Javascript
JavaScript 学习笔记之数据类型
2015/01/14 Javascript
JavaScript获取文本框内选中文本的方法
2015/02/20 Javascript
js实现有时间限制消失的图片方法
2015/02/27 Javascript
javascript返回顶部的按钮实现方法
2016/01/09 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
2017/05/17 Javascript
微信小程序新增的拖动组件movable-view使用教程
2017/05/20 Javascript
js 监控iframe URL的变化实例代码
2017/07/12 Javascript
微信小程序实现弹出菜单功能
2018/06/12 Javascript
详解Vue内部怎样处理props选项的多种写法
2018/11/06 Javascript
小程序如何自主实现拦截器的示例代码
2019/11/04 Javascript
Vue 样式切换及三元判断样式关联操作
2020/08/09 Javascript
用webAPI实现图片放大镜效果
2020/11/23 Javascript
Django中模版的子目录与include标签的使用方法
2015/07/16 Python
python 删除大文件中的某一行(最有效率的方法)
2017/08/19 Python
Python实现将HTML转换成doc格式文件的方法示例
2017/11/20 Python
python解决js文件utf-8编码乱码问题(推荐)
2018/05/02 Python
python 设置输出图像的像素大小方法
2019/07/04 Python
python 列表推导和生成器表达式的使用
2021/02/01 Python
纯CSS3实现移动端展开和收起效果的示例代码
2020/04/26 HTML / CSS
可靠的数据流传输TCP
2016/03/15 面试题
自动化专业毕业生自荐信
2013/11/01 职场文书
医药销售求职信范文
2014/02/01 职场文书
好听的队名和口号
2014/06/09 职场文书
岗位工作说明书
2014/07/29 职场文书
教师查摆问题自查报告
2014/10/11 职场文书
群众路线教育实践活动心得体会(四风)
2014/11/03 职场文书
导游词之舟山普陀山
2019/11/06 职场文书
MySQL派生表联表查询实战过程
2022/03/20 MySQL