您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

php-关于检查文件类型函数的疑问

2025/12/6 0:02:55发布20次查看
php
/** * 检查文件类型 * * @access public * @param string filename 文件名 * @param string realname 真实文件名 * @param string limit_ext_types 允许的文件类型 * @return string */function check_file_type($filename, $realname = '', $limit_ext_types = ''){ if ($realname) { $extname = strtolower(substr($realname, strrpos($realname, '.') + 1));//获取文件后缀名 } else { $extname = strtolower(substr($filename, strrpos($filename, '.') + 1)); } if ($limit_ext_types && stristr($limit_ext_types, '|' . $extname . '|') === false)// { return ''; } $str = $format = ''; $file = @fopen($filename, 'rb'); if ($file) { $str = @fread($file, 0x400); // 读取前 1024 个字节 @fclose($file); } else { if (stristr($filename, root_path) === false) { if ($extname == 'jpg' || $extname == 'jpeg' || $extname == 'gif' || $extname == 'png' || $extname == 'doc' || $extname == 'xls' || $extname == 'txt' || $extname == 'zip' || $extname == 'rar' || $extname == 'ppt' || $extname == 'pdf' || $extname == 'rm' || $extname == 'mid' || $extname == 'wav' || $extname == 'bmp' || $extname == 'swf' || $extname == 'chm' || $extname == 'sql' || $extname == 'cert'|| $extname == 'pptx' || $extname == 'xlsx' || $extname == 'docx') { $format = $extname; } } else { return ''; } } if ($format == '' && strlen($str) >= 2 ) { if (substr($str, 0, 4) == 'mthd' && $extname != 'txt') { $format = 'mid'; } elseif (substr($str, 0, 4) == 'riff' && $extname == 'wav') { $format = 'wav'; } elseif (substr($str ,0, 3) == \xff\xd8\xff) { $format = 'jpg'; } elseif (substr($str ,0, 4) == 'gif8' && $extname != 'txt') { $format = 'gif'; } elseif (substr($str ,0, 8) == \x89\x50\x4e\x47\x0d\x0a\x1a\x0a) { $format = 'png'; } elseif (substr($str ,0, 2) == 'bm' && $extname != 'txt') { $format = 'bmp'; } elseif ((substr($str ,0, 3) == 'cws' || substr($str ,0, 3) == 'fws') && $extname != 'txt') { $format = 'swf'; } elseif (substr($str ,0, 4) == \xd0\xcf\x11\xe0) { // d0cf11e == docfile == microsoft office document if (substr($str,0x200,4) == \xec\xa5\xc1\x00 || $extname == 'doc') { $format = 'doc'; } elseif (substr($str,0x200,2) == \x09\x08 || $extname == 'xls') { $format = 'xls'; } elseif (substr($str,0x200,4) == \xfd\xff\xff\xff || $extname == 'ppt') { $format = 'ppt'; } } elseif (substr($str ,0, 4) == pk\x03\x04) { if (substr($str,0x200,4) == \xec\xa5\xc1\x00 || $extname == 'docx') { $format = 'docx'; } elseif (substr($str,0x200,2) == \x09\x08 || $extname == 'xlsx') { $format = 'xlsx'; } elseif (substr($str,0x200,4) == \xfd\xff\xff\xff || $extname == 'pptx') { $format = 'pptx'; }else { $format = 'zip'; } } elseif (substr($str ,0, 4) == 'rar!' && $extname != 'txt') { $format = 'rar'; } elseif (substr($str ,0, 4) == \x25pdf) { $format = 'pdf'; } elseif (substr($str ,0, 3) == \x30\x82\x0a) { $format = 'cert'; } elseif (substr($str ,0, 4) == 'itsf' && $extname != 'txt') { $format = 'chm'; } elseif (substr($str ,0, 4) == \x2ermf) { $format = 'rm'; } elseif ($extname == 'sql') { $format = 'sql'; } elseif ($extname == 'txt') { $format = 'txt'; } } if ($limit_ext_types && stristr($limit_ext_types, '|' . $format . '|') === false) { $format = ''; } return $format;}
整个函数用于检测文件类型,其中
elseif (substr($str ,0, 3) == \xff\xd8\xff) { $format = 'jpg'; } elseif (substr($str ,0, 8) == \x89\x50\x4e\x47\x0d\x0a\x1a\x0a) { $format = 'png'; } elseif (substr($str ,0, 4) == \xd0\xcf\x11\xe0) if (substr($str,0x200,4) == \xec\xa5\xc1\x00 || $extname == 'doc') { $format = 'doc'; } elseif (substr($str,0x200,2) == \x09\x08 || $extname == 'xls') { $format = 'xls'; } elseif (substr($str,0x200,4) == \xfd\xff\xff\xff || $extname == 'ppt') { $format = 'ppt'; }
这些语句的原理是什么?而且为什么都用十六进制?
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product