天天看點

[函數] PHP取二進制檔案頭快速判斷檔案類型

一般我們都是按照檔案擴充名來判斷檔案類型,但其實不太靠譜,因為可以通過修改擴充名來僞裝檔案類型。

其實我們可以通過讀取檔案資訊來識别,

比如 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. }

複制代碼