您好,登錄后才能下訂單哦!
如何通過文件頭準確識別PHP上傳的文件類型,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
<?php /** * 通過文件名,獲得文件類型* * @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); } }
調(diào)用方法:
$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
通過WinHex軟件來獲取文件的頭信息: 可以看到:png 文件,頭是4個字節(jié)(頭標記是多少字節(jié)需要自己查相關(guān)資料確定),對應是:89504E47
看完上述內(nèi)容,你們掌握如何通過文件頭準確識別PHP上傳的文件類型的方法了嗎?如果還想學到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。