Sometimes we do this imperfectly. Some people may save some files on their computer, but they change the extension so that they fall within our file type. It cannot be displayed during actual access (because the extension does not match the file content). The following php class may be able to help us.
1. PHP detection class
First of all, let me explain that the above mapping relationship between file headers and file types comes from the Internet. If you have new files to check, you only need to add the mapping. If you need to know the file header information, you can open the standard file and search through the tool: winhex. For example:
Code:
Copy code The code is as follows:
/*Get the file type through the file name*
*@author chengmo*
*@copyright cnblog.com/chengmo 2010 -10-17
*@version 0.1
*$filename="d:/1.png";echo cFileTypeCheck::getFileType($filename); print: png
*/
class cFileTypeCheck
{
private static $_TypeList= array();
private static $CheckClass=null;
private function __construct($filename)
{
self::$_TypeList=$this->getTypeList();
}
/**
*Process file type mapping table*
*
* @param string $filename file type
* @return string file type, not found return: other
*/
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); //Read only 15 bytes for different file types, the header information is different .
fclose($file);
$typelist=self::$_TypeList;
foreach ($typelist as $v)
{
$blen=strlen(pack("H*",$v[0])); / /Get the number of bytes marked in the file header
$tbin=substr($bin,0,intval($blen)); ///Need to compare the length of the file header
if(strtolower($v[0])==strtolower(array_shift) (unpack("H*",$tbin))))
{
return $v[1];
}
}
return $filetype;
}
/**
*Get file header and file type mapping table*
*
* @return array array(array('key',value)...)
*/
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);
$class=self::$CheckClass;
return $class->_getFileType($filename);
}
}
Copy code The code is as follows:
$filename="d:/1.png";
echo $filename,"t", cFileTypeCheck::getFileType($filename),"rn";
$filename="d:/test.doc";
echo $filename,"t",cFileTypeCheck::getFileType($filename),"rn";
d :/1.png png
d:/test.doc xls/doc
The above introduces the general code class for PHP to detect file types through file headers (zip, rar, etc.), including aspects of the content. I hope it will be helpful to friends who are interested in PHP tutorials.