千家信息网

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

发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,如何通过文件头准确识别PHP上传的文件类型,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
千家信息网最后更新 2025年01月31日如何通过文件头准确识别PHP上传的文件类型

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

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上传的文件类型的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!

0