PHP如何根据文件头检测文件类型实例代码
时间:2022-07-27
本文章向大家介绍PHP如何根据文件头检测文件类型实例代码,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
前言
什么是文件头部Bom? 说白了,就是在保存文件的时候,文件前面会多出一串隐藏的字符,文件签名一般都在文件的头部,如果你用十六进制方式查看文件,你就可以看到文件的一些签名信息。如用uestudio以十六进制方式查看zip格式的文件,其文件内容头部有50 4B 03 04这样的十六进制信息。同理jpg文件状况有FF D8 FF E0 xx xx 4A 46这样的十六进制信息,其实这此十六进制都是表示一些特殊字条。
php怎么样验证文件类型?
先来看一个简单的方法:
<?php
function checkFileType($fileName){
$file = fopen($fileName, "rb");
$bin = fread($file, 2); //只读2字节
fclose($file);
// C为无符号整数,网上搜到的都是c,为有符号整数,这样会产生负数判断不正常
$strInfo = @unpack("C2chars", $bin);
$typeCode = intval($strInfo['chars1'].$strInfo['chars2']);
$fileType = '';
switch( $typeCode )
{
case '255216':
return $typeCode. ' : ' .'jpg';
break;
case '7173':
return $typeCode. ' : ' .'gif';
break;
case '13780':
return $typeCode. ' : ' .'png';
break;
case '6677':
return $typeCode. ' : ' .'bmp';
break;
case '7790':
return $typeCode. ' : ' .'exe';
break;
case '7784':
return $typeCode. ' : ' .'midi';
break;
case '8297':
return $typeCode. ' : ' .'rar';
break;
default:
return $typeCode. ' : ' .'Unknown';
break;
}
//return $typeCode;
}
$file_name = '11.doc';
echo checkFileType($file_name);
下来提供一个类的实现:
<?php
/*通过文件名,获得文件类型*
*@author chengmo QQ:8292669*
*@copyright <a href="http://www.cnblogs.com/chengmo" http://www.cnblogs.com/chengmo</a 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);
}
}
$filename="22.jpg";
echo $filename,"t",cFileTypeCheck::getFileType($filename),"rn";
$filename="11.doc";
echo $filename,"t",cFileTypeCheck::getFileType($filename),"rn";
或者可以这么检测:
<?php
$filename = '22.jpg';
$extname = strtolower(substr($filename, strrpos($filename, '.') + 1));
echo $extname.'<br / ';
$file = @fopen($filename, 'rb');
if ($file)
{
$str = @fread($file, 0x400); // 读取前 1024 个字节
echo substr($str, 0, 4);
@fclose($file);
}
if (substr($str, 0, 4) == 'MThd' && $extname != 'txt')
{
$format = 'mid';
}
elseif (substr($str, 0, 4) == 'RIFF' && $extname == 'wav')
{
$format = 'wav';
}
elseif (substr($str ,0, 3) == "/xFF/xD8/xFF")
{
$format = 'jpg';
}
elseif (substr($str ,0, 4) == 'GIF8' && $extname != 'txt')
{
$format = 'gif';
}
elseif (substr($str ,0, 8 ) == "/x89/x50/x4E/x47/x0D/x0A/x1A/x0A")
{
$format = 'png';
}
elseif (substr($str ,0, 2) == 'BM' && $extname != 'txt')
{
$format = 'bmp';
}
elseif ((substr($str ,0, 3) == 'CWS' || substr($str ,0, 3) == 'FWS') && $extname != 'txt')
{
$format = 'swf';
}
elseif (substr($str ,0, 4) == "/xD0/xCF/x11/xE0")
{ // D0CF11E == DOCFILE == Microsoft Office Document
if (substr($str,0x200,4) == "/xEC/xA5/xC1/x00" || $extname == 'doc')
{
$format = 'doc';
}
elseif (substr($str,0x200,2) == "/x09/x08" || $extname == 'xls')
{
$format = 'xls';
} elseif (substr($str,0x200,4) == "/xFD/xFF/xFF/xFF" || $extname == 'ppt')
{
$format = 'ppt';
}
} elseif (substr($str ,0, 4) == "PK/x03/x04")
{
$format = 'zip';
} elseif (substr($str ,0, 4) == 'Rar!' && $extname != 'txt')
{
$format = 'rar';
} elseif (substr($str ,0, 4) == "/x25PDF")
{
$format = 'pdf';
} elseif (substr($str ,0, 3) == "/x30/x82/x0A")
{
$format = 'cert';
} elseif (substr($str ,0, 4) == 'ITSF' && $extname != 'txt')
{
$format = 'chm';
} elseif (substr($str ,0, 4) == "/x2ERMF")
{
$format = 'rm';
} elseif ($extname == 'sql')
{
$format = 'sql';
} elseif ($extname == 'txt')
{
$format = 'txt';
}
echo $format;
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对ZaLou.Cn的支持。
- 人工智能拥有意识,仅是一个时间问题而已
- sqlserver 配置c3p0 连接池
- spring mvc 返回图片的请求
- JavaWeb(二)cookie与session的应用
- JS魔法堂:函数重载 之 获取变量的数据类型
- 开发问题(一)在windows和linux端口占用问题
- Linux文件系统的实现
- Design Pattern: Not Just Mixin Pattern
- 关于PHP字符编码的函数区别
- Java集合源码分析(二)Linkedlist
- array_shift() 函数
- 可穿戴设备:不要纠结“可穿戴”
- RXTX for JAVA 串口通信
- Java集合源码分析(一)ArrayList
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- input/change/composition/keydown事件详解
- isSameDate
- 【python-leetcode57-区间合并】插入区间
- 【python-leetcode56-区间合并】合并区间
- 【python-leetcode876-快慢指针】链表的中间节点
- vuejs之springboot+vue+element-ui之分页显示相关信息
- vuejs之vue和springboot后端进行通信
- vuejs之springboot+vue+element-ui之添加信息
- vuejs之使用axios发送http请求
- vuejs小例子之记事本
- c语言之在main中获取命令行的参数
- c语言之指针数组
- c语言之函数指针和指针函数的区别
- vuejs之v-model
- c语言之指向函数的指针