需根据文件内容自动补全无扩展名文件的正确后缀:先用fileinfo扩展分析二进制特征获取mime类型并映射常见扩展名,再对文本类文件用正则匹配shebang等标记快速识别。

当PHP脚本批量处理用户上传的文件或解析日志中的路径时,常遇到没有扩展名的文件名(如“report”“config”“image123”),需根据文件内容自动补全正确扩展名,避免后续读取失败或类型误判。
用fileinfo扩展识别二进制特征
第一步:确认PHP已启用fileinfo扩展。在命令行运行 php -m | grep fileinfo,若无输出,需编辑php.ini启用 extension=fileinfo 并重启PHP服务。
第二步:调用 finfo_open(FILEINFO_MIME_TYPE) 创建资源,再用 finfo_file() 读取文件头字节获取MIME类型。注意:该函数不依赖扩展名,只分析实际字节流,对伪造扩展名的文件也有效。
第三步:将MIME类型映射为常见扩展名。例如 image/jpeg → .jpg、text/plain → .txt、application/pdf → .pdf。可建立关联数组,但【不要硬编码全部MIME】,优先覆盖项目中真实出现的类型,避免因冷门MIME未定义导致返回空值。
用内容正则匹配快速判断文本类文件
方法一:对疑似文本文件(如大小<1MB且无NUL字节),直接读取前4096字节,用正则检测典型标记。
if (preg_match('/^#!.*?\/(bash|sh|python|perl)/i', $head)) return '.sh'; —— 匹配shell或脚本shebang行。
if (strpos($head, '<?php ') === 0 || preg_match('/<\?xml/i', $head)) return '.php'; —— 注意XML声明必须在开头附近,否则可能是HTML混入。
方法二:检查JSON结构。用 json_decode($head, true, 512, JSON_THROW_ON_ERROR) 尝试解析,成功则返回 '.json';捕获 JsonException 则跳过。这一步必须加 JSON_THROW_ON_ERROR,否则静默失败会掩盖真实问题。
回退到文件名线索与白名单组合策略
当fileinfo和内容检测均未返回结果时,启用辅助判断:
① 提取原始文件名(不含路径)→ ② 检查是否含常见关键词(如“readme”“license”“changelog”)→ ③ 若匹配,固定返回 '.txt';若含“docker”“k8s”“yml”,尝试返回 '.yaml';若含“make”“configure”,返回 '.sh'。
④ 最后检查文件大小:0字节文件统一返回 '.bin',避免误标为文本;大于10MB的纯ASCII文件(无控制字符)才考虑 '.log' 或 '.csv',否则默认 '.bin'。
这一步不依赖外部扩展,但【关键词匹配必须区分大小写敏感场景】,例如“Makefile”应匹配,而“makefile”在Linux下合法,在Windows下可能被转为小写,需统一转小写再比对。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











