使用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
相关产品推荐
相关产品推荐

