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
付杰
  • ¥ 129.0元
  • 市场价:199.0元
  • ¥ 818.0元
  • 市场价:1688.0元
  • ¥ 58元
  • 市场价:58元
  • ¥ 99.0元
  • 市场价:129.0元

发表评论

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