从网站安全角度考虑,在用php上传文件时一般限制可上传的文件类型的做法是通过文件的后缀进行判断,但这样的做法存在缺点,相信所有的程序员都是知道的,下面介绍一个可以从最根本上判断用户上传的文件类型的函数。

简要分析一下本函数通过文件头信息实现判断上传文件类型的过程思路,首先使用用fopen()函数打开上传的文件,然后通过fread()读取文件的前2个字节。得到的内容会是二进制的字符串,为了能在程序代码中做判断,这里使用的是unpack()函数把二进制数据转换成十进制数字的字符串(unpack()函数主要用于二进制操作,具体用法可参见php帮助文档,这里做解释!),然后进行判断即可。

$filename='http://www.youkud.com/image/logo-banner.jpg';
$file=fopen($filename,'rb');
$bin=fread($file,2); //只读取上传文件的头文信息的2个字节
fclose($file);
$strInfo=@unpack('c2chars',$bin);
$typeCode=intval($strInfo['chars1'].$strInfo['chars2']);
$fileType='';
switch ($typeCode){
	case 7790:
		$fileType='exe';
	break;
	case 7784:
		$fileType='midi';
	break;
	case 8297:
		$fileType='rar';
	break;
	case 255216:
		$fileType='jpg';
	break;
	case 7173:
		$fileType='gif';
	break;
	case 6677:
		$fileType='bmp';
	break;
	case 13780:
		$fileType='png';
	break;
	default:
		echo 'unknown';
	break;
}
echo '文件类型:'.$fileType.' 文件头信息:'.$typeCode;