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的FTP学习(二)[转自奥索]
Oct 09 PHP
php面向对象全攻略 (十四) php5接口技术
Sep 30 PHP
PHP 文件上传全攻略
Apr 28 PHP
zend optimizer在wamp的基础上安装图文教程
Oct 26 PHP
php实现的短网址算法分享
Jun 20 PHP
php的mssql数据库连接类实例
Nov 28 PHP
php实现约瑟夫问题的方法小结
Mar 23 PHP
比较完整的微信开发php代码
Aug 02 PHP
PHP单例模式详解及实例代码
Dec 21 PHP
微信接口生成带参数的二维码
Jul 31 PHP
PHP htmlentities()函数用法讲解
Feb 25 PHP
PHP预定义接口――Iterator用法示例
Jun 05 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实现文件上传二法
2006/10/09 PHP
一个简单的自动发送邮件系统(一)
2006/10/09 PHP
php header功能的使用
2013/10/28 PHP
php查找字符串出现次数的方法
2014/12/01 PHP
3种php生成唯一id的方法
2015/11/23 PHP
浅谈PHP安全防护之Web攻击
2017/01/03 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
js 刷新页面的代码小结 推荐
2010/04/02 Javascript
boxy基于jquery的弹出层对话框插件扩展应用 弹出层选择器
2010/11/21 Javascript
分享一个用Mootools写的鼠标滑过进度条改变进度值的实现代码
2011/12/12 Javascript
JavaScript 函数惰性载入的实现及其优点介绍
2013/08/12 Javascript
Jquery 1.9.1源码分析系列(十二)之筛选操作
2015/12/02 Javascript
WebApi+Bootstrap+KnockoutJs打造单页面程序
2016/05/16 Javascript
使用BootStrapValidator完成前端输入验证
2016/09/28 Javascript
Express系列之multer上传的使用
2017/10/27 Javascript
利用angular、react和vue实现相同的面试题组件
2018/02/19 Javascript
Vue表单类的父子组件数据传递示例
2018/05/03 Javascript
微信小程序:报错(in promise) MiniProgramError
2020/10/30 Javascript
python实现字符串连接的三种方法及其效率、适用场景详解
2017/01/13 Python
Python之Scrapy爬虫框架安装及简单使用详解
2017/12/22 Python
在Django中输出matplotlib生成的图片方法
2018/05/24 Python
python+opencv实现摄像头调用的方法
2019/06/22 Python
HTML5中图片之间的缝隙完美解决方法
2017/07/07 HTML / CSS
Maje德国官网:法国女性成衣品牌
2017/02/10 全球购物
澳大利亚第一旅行车和房车配件店:Caravan RV Camping
2020/12/26 全球购物
100%羊绒:NakedCashmere
2020/08/26 全球购物
临床医学大学生求职信
2013/09/28 职场文书
前台接待岗位职责
2013/12/03 职场文书
数学检讨书1000字
2014/02/24 职场文书
关于学习的演讲稿
2014/05/10 职场文书
酒店收银员岗位职责
2015/04/07 职场文书
大学运动会通讯稿
2015/07/18 职场文书
关于军训的感想
2015/08/07 职场文书
教师节主题班会教案
2015/08/17 职场文书
关于springboot 配置date字段返回时间戳的问题
2021/07/25 Java/Android
手写实现JS中的new
2021/11/07 Javascript