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 文件上传代码(限制jpg文件)
Jan 05 PHP
php excel reader读取excel内容存入数据库实现代码
Dec 06 PHP
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
Oct 14 PHP
php中simplexml_load_file函数用法实例
Nov 12 PHP
php+jQuery+Ajax实现点赞效果的方法(附源码下载)
Jul 21 PHP
PHP文件上传之多文件上传的实现思路
Jan 27 PHP
PHP通过CURL实现定时任务的图片抓取功能示例
Oct 03 PHP
微信 开发生成带参数的二维码的实例
Nov 23 PHP
Django中的cookie与session操作实例代码
Aug 17 PHP
PHP实现财务审核通过后返现金额到客户的功能
Jul 04 PHP
php进行md5加密简单实例方法
Sep 19 PHP
PHP常用函数之根据生日计算年龄功能示例
Oct 21 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
动漫女神老婆无限好,但日本女生可能就不是这么一回事了!
2020/03/04 日漫
Windows 下的 PHP-PEAR 安装方法
2010/11/20 PHP
php管理nginx虚拟主机shell脚本实例
2014/11/19 PHP
windows下apache搭建php开发环境
2015/08/27 PHP
ThinkPHP框架整合微信支付之刷卡模式图文详解
2019/04/10 PHP
tp5.0框架隐藏index.php入口文件及模块和控制器的方法分析
2020/02/11 PHP
PHP实现基本留言板功能原理与步骤详解
2020/03/26 PHP
js滚动条回到顶部的代码
2011/12/06 Javascript
JS响应鼠标点击实现两个滑块区间拖动效果
2015/10/26 Javascript
JS组件Bootstrap Select2使用方法详解
2020/04/17 Javascript
jQuery ajaxSubmit 实现ajax提交表单局部刷新
2016/07/04 Javascript
快速解决js开发下拉框中blur与click冲突
2016/10/10 Javascript
使用 jQuery.ajax 上传带文件的表单遇到的问题
2016/10/31 Javascript
利用jQuery插件imgAreaSelect实现获得选择域的图像信息
2016/12/02 Javascript
Angular的自定义指令以及实例
2016/12/26 Javascript
Angular2中如何使用ngx-translate进行国际化
2017/05/21 Javascript
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
windows系统下更新nodejs版本的方案
2017/11/24 NodeJs
Vue中的transition封装组件的实现方法
2019/08/13 Javascript
js仿京东放大镜效果
2020/08/09 Javascript
[00:48]DOTA2国际邀请赛公开赛报名开始 扫码开启逐梦之旅
2018/06/06 DOTA
Python面向对象程序设计之私有属性及私有方法示例
2019/04/08 Python
python实现企业微信定时发送文本消息的示例代码
2020/11/24 Python
HTML5 LocalStorage 本地存储刷新值还在
2017/03/10 HTML / CSS
Sephora丝芙兰泰国官方网站:国际知名化妆品购物
2017/11/15 全球购物
大学生村官心得体会范文
2014/01/04 职场文书
小学生综合素质评语
2014/04/23 职场文书
数学系毕业生求职信
2014/05/29 职场文书
食品科学与工程专业毕业生求职信范文
2014/07/21 职场文书
师德师风自我评价范文
2014/09/11 职场文书
中标通知书范本
2015/04/17 职场文书
go:垃圾回收GC触发条件详解
2021/04/24 Golang
Oracle配置dblink访问PostgreSQL的操作方法
2022/03/21 PostgreSQL
nginx共享内存的机制详解
2022/03/21 Servers
Python中使用tkFileDialog实现文件选择、保存和路径选择
2022/05/20 Python
clear 万能清除浮动(clearfix:after)
2023/05/21 HTML / CSS