PHP上传docx文件时MIME类型重复问题求助
问题原因与解决思路
可能的原因:
- 文件元数据重复定义:docx属于OOXML压缩格式,内部的
[Content_Types].xml文件如果重复写入了对应docx的MIME类型条目,会导致mime_content_type读取时拼接出重复值。比如该文件的这个配置文件里出现了两次<Default Extension="docx" ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document"的定义。 - 系统mime.magic数据库异常:
mime_content_type依赖系统的mime识别数据库,部分旧版本系统或数据库配置有问题时,对复合格式文件的识别逻辑会出错,重复解析了相同的标识。 - 文件损坏或被篡改:该docx在传输、编辑过程中被意外追加了重复的MIME标识数据,或者用非标准工具编辑后,写入了重复的元信息。
验证与解决方法:
- 验证文件本身问题:
把该docx文件解压,找到[Content_Types].xml文件打开查看,检查是否存在重复的MIME类型定义;也可以在终端用file --mime-type 文件名.docx命令检测,对比结果是否正常。 - 代码层面兼容处理:
- 对获取到的MIME类型做去重,比如用正则:
$mime_type = preg_replace('/(.+)\1/', '$1', $mime_type); - 替换为更可靠的
finfo类来检测MIME类型,示例代码:$finfo = new finfo(FILEINFO_MIME_TYPE); $mime_type = $finfo->file($_FILES['input_name']['tmp_name']); - 结合文件扩展名做双重校验,比如先判断扩展名是docx,再配合MIME类型检测,降低误判概率。
- 对获取到的MIME类型做去重,比如用正则:
- 用户侧修复:
让用户用Microsoft Word重新打开该文件并另存为新的docx,Word会自动修复异常的元数据结构。
内容的提问来源于stack exchange,提问作者user3541184
相关产品推荐
相关产品推荐

