讀取檔案前 15 位元組,比對已知檔案格式的魔數特徵碼,不依賴副檔名,安全可靠。
CFileTypeCheckclass 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
finfo_open (Fileinfo 擴展) 作為二次驗證。