PHP读取文件头,2字节判断文件类型

看到此标题或许你会说是否是多此一举,直接判断扩展名不就知道文件类型了吗,但是扩展名很容易伪造,这样就绕过了判断。

大部分的文件都会将一个特殊的数字或字符存放在文件的特定位置里(开始处的2个字节)

  1. /**
  2. * @author Mckee
  3. * @link http://www.phpddt.com
  4. */
  5. //使用 'b' 来强制使用二进制模式
  6. $fp = fopen('qq.jpg','rb');
  7. //只读二进制文件,前2个字节就可以判断文件类型
  8. $bin = fread($fp,2);
  9. fclose($fp);
  10. //将二进制的字符串转化为格式化的字符串,这里转化为十进制整数
  11. $code = unpack('C2chars', $bin);//这里返回数组,自己看看
  12. $type_code = intval($code['chars1'].$code['chars2']);
  13. $type ='';
  14. switch($type_code){
  15. case255216: $type ='jpg';break;
  16. case7173: $type ='gif';break;
  17. case6677: $type ='bmp';break;
  18. case13780: $type ='png';break;
  19. default: $type ='unknown';
  20. }
  21. echo $type;

上面这段代码只是引子,并不精准,读者自己研究吧,即使这样也是可以伪造的,如果是图片类型,还有很多人会用getimagesize($file)来判断。