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项目的方法
Oct 09 PHP
特详细的PHPMYADMIN简明安装教程
Aug 01 PHP
php 正则表达式小结
Aug 31 PHP
PHP setcookie指定domain参数后,在IE下设置cookie失效的解决方法
Sep 09 PHP
php抽奖小程序的实现代码
Jun 18 PHP
微信公众平台开发实现2048游戏的方法
Apr 15 PHP
php中smarty变量修饰用法实例分析
Jun 11 PHP
php array_merge_recursive 数组合并
Oct 26 PHP
YII框架批量插入数据的方法
Mar 18 PHP
PHP实现文件上传功能实例代码
May 18 PHP
在Laravel中使用DataTables插件的方法
May 29 PHP
PHP数组对象与Json转换操作实例分析
Oct 22 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的openssl加密扩展使用小结(推荐)
2016/07/18 PHP
使用PHPExcel实现数据批量导出为excel表格的方法(必看)
2017/06/09 PHP
js可突破windows弹退效果代码
2008/08/09 Javascript
extjs实现选择多表自定义查询功能 前台部分(ext源码)
2011/12/20 Javascript
javascript 图片裁剪技巧解读
2012/11/15 Javascript
JSON+JavaScript处理JSON的简单例子
2013/03/20 Javascript
JavaScript的继承的封装介绍
2013/10/15 Javascript
sencha touch 模仿tabpanel导航栏TabBar的实例代码
2013/10/24 Javascript
Extjs Label的 fieldLabel和html属性值对齐的方法
2014/06/15 Javascript
JavaScript 实现完美兼容多浏览器的复制功能代码
2015/04/28 Javascript
jquery实现叠层3D文字特效代码分享
2015/08/21 Javascript
Labelauty?jQuery单选框/复选框美化插件分享
2015/09/26 Javascript
js实现C#的StringBuilder效果完整实例
2015/12/22 Javascript
vue.js的提示组件
2017/03/02 Javascript
jQuery EasyUI tree增加搜索功能的实现方法
2017/04/27 jQuery
Angular Renderer (渲染器)的具体使用
2018/05/03 Javascript
Angular2 自定义表单验证器的实现方法
2018/12/14 Javascript
webpack常用配置总览(小结)
2019/11/18 Javascript
[01:32]完美世界DOTA2联赛10月29日精彩集锦
2020/10/30 DOTA
跟老齐学Python之重回函数
2014/10/10 Python
Python文件夹与文件的相关操作(推荐)
2016/07/25 Python
Python 如何访问外围作用域中的变量
2016/09/11 Python
python生成随机图形验证码详解
2017/11/08 Python
python爬虫之自动登录与验证码识别
2020/06/15 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
2021/01/08 Python
HTML5和CSS3让网页设计提升到下一个高度
2009/08/14 HTML / CSS
Tory Burch美国官方网站:美国时尚生活品牌
2016/08/01 全球购物
西班牙购买行李箱和背包网站:Maletas Greenwich
2019/10/08 全球购物
师范学院美术系毕业生自我鉴定
2014/01/29 职场文书
2014学雷锋活动心得体会
2014/03/10 职场文书
工地质量标语
2014/06/12 职场文书
政风行风评议工作总结
2014/10/21 职场文书
教师个人考察材料
2014/12/16 职场文书
撤诉状格式范本
2015/05/19 职场文书
幸福终点站观后感
2015/06/04 职场文书