PHP通过获取头信息判断图片类型的方法

今天用PHP在做上传图片的时候,发现我的程序有一个小BUG,我把 .exe 后缀的文件改为了 .jpg ,结果上传也能成功,我就想着只能通过获取图片头信息来判断图片的真实类型才能改变这种情况。

 

JPG/JPEG 图片头信息 16进制如下:JPG/JPEG 图片头信息

 

PNG 图片头信息 16进制如下:PNG 图片头信息

 

GIF 图片头信息 16进制如下GIF 图片头信息

 

网上找了很多代码,很多其实都是没有效果的,历经千幸万苦,结果找到了。

 

PHP通过获取头信息判断图片类型 代码

 

第一种方法:

<?php
$file = @fopen('fujieace.png', "rb");
$bin = @fread($file, 15); //只读15字节 各个不同文件类型,头信息不一样。
if(true === get_type_list($bin)) {
    echo '该图片在指定的图片格式中';
}
else{
    echo '该图片上传格式错误';
  }
@fclose($file );
   
/**
* 得到文件头与文件类型映射表*
* author wengxianhu
* @param $bin string 图片的二进制前一段字符
* @return boolean
*/
//public function get_type_list($bin)
function get_type_list($bin)
{
    $array = array(
        array("FFD8FFE1","jpg"),
        array("89504E47","png"),
        array("47494638","gif"),
        array("FFD8FFE000104A46", "jpeg")
//         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"),
//         array("D3C3BBA7", 'csv')
    );
   
    foreach ($array 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 true;
        }
    }
    return false;
}

 

第二种方法:

<?php
$filename = 'fujieace.png' ; 
function pictype ( $file ) 
{ 
   /*$png_header = "/x89/x50/x4e/x47/x0d/x0a/x1a/x0a"; 
   $jpg_header = "/xff/xd8";*/
   $header = @file_get_contents ( $file , 0 , NULL , 0 , 15 ); 
   //echo bin2hex($header); 
   $header = bin2hex($header);
   //echo '<hr />';
   if ( $header{0}.$header{1}.$header{2}.$header{3}.$header{4}.$header{5}.$header{6}.$header{7} == "89504e47" ) 
   { 
     return 'png' ; 
   } 
   elseif( $header{0}.$header{1}.$header{2}.$header{3}.$header{4}.$header{5}.$header{6}.$header{7}.$header{8}.$header{9}.$header{10}.$header{11}.$header{12}.$header{13}.$header{14}.$header{15} == "ffd8ffe000104a46"  ) 
   { 
     return 'jpeg' ; 
   } 
   elseif($header{0}.$header{1}.$header{2}.$header{3}.$header{4}.$header{5}.$header{6}.$header{7} == "ffd8ffe1"){
	 return 'jpg' ;    
   }
   elseif( $header{0}.$header{1}.$header{2}.$header{3}.$header{4}.$header{5}.$header{6}.$header{7} == "47494638" ) 
   { 
     if( $header{8}.$header{9} == "37" ) 
       return 'gif87' ; 
     else if( $header{8}.$header{9} == "39" ) 
       return 'gif89' ; 
   }
   else{
	   return '不允许的图片类型';
   }
} 
echo pictype ( $filename );
    A+
发布日期:2020年07月02日 14:35:25  所属分类:PHP
最后更新时间:2020-07-02 14:47:03
评分: (1 票;平均数5.00 ;最高评分 5 ;用户总数1;总得分 5;百分比100.00)
付杰
wordpress站群服务 泛解析二级域名 二级目录站群
wordpress站群服务 泛解析二级域名 二级目录站群
  • ¥ 1999.9元
  • 市场价:4800元
wp discux 帝国 dedecms phpcms等快速建站
wp discux 帝国 dedecms phpcms等快速建站
  • ¥ 99.9元
  • 市场价:499.9元
PHP运行环境 wamp lamp lnmp 安装 配置 搭建
PHP运行环境 wamp lamp lnmp 安装 配置 搭建
  • ¥ 9.9元
  • 市场价:49.9元
免费SSL证书 HTTPS申请 安装 配置 支持通配符*
免费SSL证书 HTTPS申请 安装 配置 支持通配符*
  • ¥ 199.9元
  • 市场价:20000元

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: