溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何通過文件頭準確識別PHP上傳的文件類型

發(fā)布時間:2021-10-11 16:40:24 來源:億速云 閱讀:127 作者:柒染 欄目:大數(shù)據(jù)

如何通過文件頭準確識別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è)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責聲明:本站發(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)容。

php
AI