You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用FastAPI接收docx文件时出现zipfile.BadZipFile错误求助

解决FastAPI上传docx文件后python-docx报zipfile.BadZipFile错误的方案

错误原因

你的代码核心问题是没有读取前端上传的文件内容,直接打开了本地的textfile.filename文件(该文件要么不存在,要么是空文件),而docx本质是zip格式的压缩包,空文件或无效内容自然会触发zipfile.BadZipFile错误。

两种可行解决方案

方案1:直接读取上传内容创建Document(无需先存本地)

利用BytesIO将上传的字节内容包装成类文件对象,直接传给Document:

from io import BytesIO
from docx import Document
import os
from fastapi import UploadFile

async def create_file(textfile: UploadFile, user):
    # 读取前端上传的文件字节内容
    file_content = await textfile.read()
    
    # 用BytesIO包装成python-docx可识别的类文件对象
    doc_stream = BytesIO(file_content)
    document = Document(doc_stream)
    doc_stream.close()
    
    # 若需要将文件保存到后端文件系统
    save_path = os.path.abspath(textfile.filename)
    with open(save_path, "wb") as f:
        f.write(file_content)
    
    # 后续可对document进行处理,比如读取内容、修改等

方案2:先保存上传文件到本地,再打开创建Document

先把上传内容写入本地文件,再读取该文件创建Document:

import os
from docx import Document
from fastapi import UploadFile

async def create_file(textfile: UploadFile, user):
    save_path = os.path.abspath(textfile.filename)
    
    # 将上传的文件内容写入本地文件
    with open(save_path, "wb") as f:
        f.write(await textfile.read())
    
    # 读取本地文件创建Document对象
    with open(save_path, "rb") as f:
        document = Document(f)
    
    # 后续处理document逻辑

补充说明

你之前尝试的Stack Overflow方案不适用,是因为那个方案针对的是本地已存在的docx文件损坏的情况,而你的问题根源是没有正确获取前端上传的文件内容,两者场景完全不同。

内容的提问来源于stack exchange,提问作者HeteroChromia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:47:11