[函数] PHP取二进制文件头快速判断文件类型

时间:2022-02-02 20:05:35
一般我们都是按照文件扩展名来判断文件类型,但其实不太靠谱,因为可以通过修改扩展名来伪装文件类型。
其实我们可以通过读取文件信息来识别,
比如 PHP扩展中提供了类似 exif_imagetype 这样的函数读取图片类的文件类型,但是很多时候扩展不一定安装了这样的扩展。
下面这个函数就展示了自己通过读取文件头信息来识别文件的真实类型:
  1. function file_type($file) {
  2.         $filepath = realpath($file);
  3.         $filetype = array(
  4.                 7790=>'exe', 7784=>'midi',
  5.                 8075=>'zip', 8297=>'rar',
  6.                 7173=>'gif', 6677=>'bmp', 13780=>'png', 255216=>'jpg'
  7.         );
  8.         if (!($fp = @fopen($filepath, 'rb'))) return false;
  9.         $bin = fread($fp, 2);
  10.         fclose($fp);
  11.         $str_info = @unpack('C2chars', $bin);
  12.         $str_code = intval($str_info['chars1'].$str_info['chars2']);
  13.         return isset($filetype[$str_code]) ? $filetype[$str_code] : 'unknown';
  14. }
复制代码