如何通过文件头准确识别PHP上传的文件类型

如何通过文件头准确识别PHP上传的文件类型,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

从策划到设计制作,每一步都追求做到细腻,制作可持续发展的企业网站。为客户提供成都做网站、成都网站建设、网站策划、网页设计、申请域名网站空间、网络营销、VI设计、 网站改版、漏洞修补等服务。为客户提供更好的一站式互联网解决方案,以客户的口碑塑造优易品牌,携手广大客户,共同发展进步。

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="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个字节(头标记是多少字节需要自己查相关资料确定),对应是:89504E47

看完上述内容,你们掌握如何通过文件头准确识别PHP上传的文件类型的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!


本文标题:如何通过文件头准确识别PHP上传的文件类型
网站路径:http://myzitong.com/article/gspgop.html