PHP取二进制文件头快速判断文件类型
<?php
$files = array(
'c:\1.jpg',
'c:\1.png',
'c:\1.gif',
'c:\1.rar',
'c:\1.zip',
'c:\1.exe',
);
foreach ($files AS $file) {
$fp = fopen($file, "rb");
$bin = fread($fp, 2); //只读2字节
fclose($fp);
$str_info = @unpack("C2chars", $bin);
$type_code = intval($str_info['chars1'].$str_info['chars2']);
$file_type = '';
switch ($type_code) {
case 7790:
$file_type = 'exe';
break;
case 7784:
$file_type = 'midi';
break;
case 8075:
$file_type = 'zip';
break;
case 8297:
$file_type = 'rar';
break;
case 255216:
$file_type = 'jpg';
break;
case 7173:
$file_type = 'gif';
break;
case 6677:
$file_type = 'bmp';
break;
case 13780:
$file_type = 'png';
break;
default:
$file_type = 'unknown';
break;
}
echo $file , ' type: <b>', $file_type, '</b> code:<b>', $type_code, '</b><br />';
}
$files = array(
'c:\1.jpg',
'c:\1.png',
'c:\1.gif',
'c:\1.rar',
'c:\1.zip',
'c:\1.exe',
);
foreach ($files AS $file) {
$fp = fopen($file, "rb");
$bin = fread($fp, 2); //只读2字节
fclose($fp);
$str_info = @unpack("C2chars", $bin);
$type_code = intval($str_info['chars1'].$str_info['chars2']);
$file_type = '';
switch ($type_code) {
case 7790:
$file_type = 'exe';
break;
case 7784:
$file_type = 'midi';
break;
case 8075:
$file_type = 'zip';
break;
case 8297:
$file_type = 'rar';
break;
case 255216:
$file_type = 'jpg';
break;
case 7173:
$file_type = 'gif';
break;
case 6677:
$file_type = 'bmp';
break;
case 13780:
$file_type = 'png';
break;
default:
$file_type = 'unknown';
break;
}
echo $file , ' type: <b>', $file_type, '</b> code:<b>', $type_code, '</b><br />';
}
本例输出结果
c:\1.jpg type: jpg code:255216
c:\1.png type: png code:13780
c:\1.gif type: gif code:7173
c:\1.rar type: rar code:8297
c:\1.zip type: zip code:8075
c:\1.exe type: exe code:7790
这种方法灵验不?
jpg的不行他截取的前两个东西 不正常
$strInfo = @unpack("c2chars", $bin);
这一行中,小写的c改成大写的C,(大写的C表示无符号),这就正常了。
Andy 于 2010-02-24 16:22:38 回复:
多谢你的指正!