2019-07-23 15:03:41 3192瀏覽
對PHP開發(fā)技術(shù)感興趣的小伙伴是否知道PHP如何根據(jù)文件頭檢測文件類型實例代碼?本篇文章扣丁學(xué)堂PHP培訓(xùn)小編就給讀者們分享一下PHP如何根據(jù)文件頭檢測文件類型的相關(guān)資料,本文將通過示例代碼給小伙伴們介紹,對大家學(xué)習(xí)或者使用PHP應(yīng)該有一定的參考學(xué)習(xí)價值,感興趣的小伙伴就隨小編來學(xué)習(xí)一下吧。
首先給大家說一下什么是文件頭部Bom?說白了,就是在保存文件的時候,文件前面會多出一串隱藏的字符,文件簽名一般都在文件的頭部,如果你用十六進制方式查看文件,你就可以看到文件的一些簽名信息。如用uestudio以十六進制方式查看zip格式的文件,其文件內(nèi)容頭部有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字節(jié) fclose($file); // C為無符號整數(shù),網(wǎng)上搜到的都是c,為有符號整數(shù),這樣會產(chǎn)生負數(shù)判斷不正常 $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);
下面提供一個類的實現(xiàn):
<?php
/*通過文件名,獲得文件類型*
*@author kouding QQ:374332265*
*@copyright <a >http://m.dionly.net.cn/</a> 2019-07-23
*@version 0.1
*$filename="d:/1.png";echo cFileTypeCheck::getFileType($filename); 打?。簆ng
*/
class cFileTypeCheck
{
private static $_TypeList=array();
private static $CheckClass=null;
private function __construct($filename)
{
self::$_TypeList=$this->getTypeList();
}
/**
*處理文件類型映射關(guān)系表*
*
* @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字節(jié) 各個不同文件類型,頭信息不一樣。
fclose($file);
$typelist=self::$_TypeList;
foreach ($typelist as $v)
{
$blen=strlen(pack("H*",$v[0])); //得到文件頭標記字節(jié)數(shù)
$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 個字節(jié) 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;
想要了解更多關(guān)于PHP開發(fā)方面內(nèi)容的小伙伴,請關(guān)注扣丁學(xué)堂PHP培訓(xùn)官網(wǎng)、微信等平臺,扣丁學(xué)堂IT職業(yè)在線學(xué)習(xí)教育有專業(yè)的PHP講師為您指導(dǎo),此外扣丁學(xué)堂老師精心推出的PHP視頻教程定能讓你快速掌握PHP從入門到精通開發(fā)實戰(zhàn)技能??鄱W(xué)堂PHP技術(shù)交流群:374332265。
【關(guān)注微信公眾號獲取更多學(xué)習(xí)資料】 【掃碼進入Python全棧開發(fā)免費公開課】
查看更多關(guān)于“php培訓(xùn)資訊”的相關(guān)文章>>