通过文件头准确识别PHP上传的文件类型 ( 一 )

<?php      
                
/**
 * 通过文件名,获得文件类型*    
 * @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="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

转载于:https://my.oschina.net/u/3901362/blog/3077727

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值