思路:通过文件头确定文件类型,可使用Notepad++以16进制查看文件头。
方法一:
print_r(mime_content_type($path));
输出:image/svg+xml
方法二:
function test()
{
$file_type_start = [
"ffd8ffe000104a464946" => "jpg",
"89504e470d0a1a0a0000" => "png",
"47494638396126026f01" => "gif",
"49492a00227105008037" => "tif",
"424d228c010000000000" => "bmp",
"424d8240090000000000" => "bmp",
"424d8e1b030000000000" => "bmp",
"41433130313500000000" => "dwg",
"3c21444f435459504520" => "html",
"3c21646f637479706520" => "htm",
"48544d4c207b0d0a0942" => "css",
"696b2e71623d696b2e71" => "js",
"7b5c727466315c616e73" => "rtf",
"38425053000100000000" => "psd",
"46726f6d3a203d3f6762" => "eml",
"d0cf11e0a1b11ae10000" => "doc",
"d0cf11e0a1b11ae10000" => "vsd",
"5374616E64617264204A" => "mdb",
"252150532D41646F6265" => "ps",
"255044462d312e350d0a" => "pdf",
"2e524d46000000120001" => "rmvb",
"464c5601050000000900" => "flv",
"00000020667479706d70" => "mp4",
"49443303000000002176" => "mp3",
"000001ba210001000180" => "mpg",
"3026b2758e66cf11a6d9" => "wmv",
"52494646e27807005741" => "wav",
"52494646d07d60074156" => "avi",
"4d546864000000060001" => "mid",
"504b0304140000000800" => "zip",
"526172211a0700cf9073" => "rar",
"235468697320636f6e66" => "ini",
"504b03040a0000000000" => "jar",
"4d5a9000030000000400" => "exe",
"3c25402070616765206c" => "jsp",
"4d616e69666573742d56" => "mf",
"3c3f786d6c2076657273" => "xml or svg",
"494e5345525420494e54" => "sql",
"7061636b616765207765" => "java",
"406563686f206f66660d" => "bat",
"1f8b0800000000000000" => "gz",
"6c6f67346a2e726f6f74" => "properties",
"cafebabe0000002e0041" => "class",
"49545346030000006000" => "chm",
"04000000010000001300" => "mxp",
"504b0304140006000800" => "docx",
"d0cf11e0a1b11ae10000" => "wps",
"6431303a637265617465" => "torrent",
"d4c3b2a1020004000000" => "pcap",
"6D6F6F76" => "mov",
"FF575043" => "wpd",
"CFAD12FEC5FD746F" => "dbx",
"2142444E" => "pst",
"AC9EBD8F" => "qdf",
"E3828596" => "pwl",
"2E7261FD" => "ram",
];
$file_path_list = [
'D:\test_image\开源协议选择流程图-1 - 副本.txt',
'D:\test_image\aaa.webp',
'D:\test_image\1635832464(1).png',
'D:\test_image\dump.pcap',
'D:\test_image\aitest.svg',
];
foreach ($file_path_list as $path) {
$file = fopen($path, 'rw');
$str = fread($file, 10);
$str_to_hex= bin2hex($str);
$file_type = '未知';
$file_type_str = $str_to_hex;
if (isset($file_type_start[$str_to_hex])) {
$file_type = $file_type_start[$str_to_hex];
} else {
foreach ($file_type_start as $key => $val) {
if (strpos(strtolower($str_to_hex), strtolower($key)) === 0) {
$file_type = $val;
$file_type_str = strtolower($key);
break;
}
}
}
echo "文件:" . $path . ':' . "</br>";
echo "开头文本:" . $str . ' 长度:' . strlen($str) . "</br>";
echo "开头文本hex:" . $str_to_hex . ' 长度:' . strlen($str_to_hex) . "</br>";
echo '文件类型:' . $file_type . "(start:". $file_type_str . ")" . "</br>";
if (@getimagesize($path)) {
echo '是有效的图片' . "</br>";
} else {
echo '无效的图片' . '</br>';
}
echo "</br>";
fclose($file);
}
}
输出:
文件:D:\test_image\开源协议选择流程图-1 - 副本.txt:
开头文本:����JFIF 长度:10
开头文本hex:ffd8ffe000104a464946 长度:20
文件类型:jpg(start:ffd8ffe000104a464946)
是有效的图片
文件:D:\test_image\aaa.webp:
开头文本:����JFIF 长度:10
开头文本hex:ffd8ffe000104a464946 长度:20
文件类型:jpg(start:ffd8ffe000104a464946)
是有效的图片
文件:D:\test_image\1635832464(1).png:
开头文本:�PNG 长度:10
开头文本hex:89504e470d0a1a0a0000 长度:20
文件类型:png(start:89504e470d0a1a0a0000)
是有效的图片
文件:D:\test_image\dump.pcap:
开头文本:�ò� 长度:10
开头文本hex:d4c3b2a1020004000000 长度:20
文件类型:pcap(start:d4c3b2a1020004000000)
无效的图片
文件:D:\test_image\aitest.svg:
开头文本:开头文本hex:3c3f786d6c2076657273 长度:20
文件类型:xml or svg(start:3c3f786d6c2076657273)
无效的图片
16进制文件头(相关:JPG文件头结构介绍)
参考链接: notepad怎么查看16进制编码 根据文件头数据判断文件类型 PHP图片损坏检测 JPG文件头结构介绍 理解JPEG文件头的格式
|