首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 依檔案 Header 判斷類型:魔數對照表與 CFileTypeCheck 類別實作

     編輯:PHP 相關知識

原理

讀取檔案前 15 位元組,比對已知檔案格式的魔數特徵碼,不依賴副檔名,安全可靠。

類別 CFileTypeCheck

class CFileTypeCheck {
    private static $_typelist = array();
    private static $checkclass = null;

    private function __construct($filename) {
        self::$_typelist = $this->gettypelist();
    }

    private function _getfiletype($filename) {
        $filetype = "other";
        if(!file_exists($filename)) throw new Exception("no found file!");
        $file = @fopen($filename, "rb");
        if(!$file) throw new Exception("file refuse!");
        $bin = fread($file, 15);
        fclose($file);
        foreach (self::$_typelist as $v) {
            $blen = strlen(pack("H*", $v[0]));
            $tbin = substr($bin, 0, $blen);
            if(strtolower($v[0]) == strtolower(array_shift(unpack("H*", $tbin)))) {
                return $v[1];
            }
        }
        return $filetype;
    }

    public function gettypelist() {
        return array(
            array("ffd8ffe1", "jpg"),
            array("89504e47", "png"),
            array("47494638", "gif"),
            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")
        );
    }

    public static function getfiletype($filename) {
        if(!self::$checkclass) self::$checkclass = new self($filename);
        return self::$checkclass->_getfiletype($filename);
    }
}

// 使用方式
echo CFileTypeCheck::getfiletype("d:/1.png"); // 輸出:png

擴充建議

  • 可持續補充魔數表支援更多格式(如 WebP, HEIC, WOFF2 等)。
  • 結合 finfo_open (Fileinfo 擴展) 作為二次驗證。
  • 大檔案僅讀取前 15 字節,效能極佳。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved