FastAPI接口传文件与参数遇编码错误及大文本传输问题求助
问题修复与解决方案
一、修复UnicodeDecodeError错误
错误核心:你的请求采用multipart/form-data格式(因使用files参数上传文件),但FastAPI端点中用await request.json()尝试将请求体解析为JSON格式——multipart数据并非JSON,直接解码必然触发UnicodeDecodeError。
正确的FastAPI端点写法
直接通过File和Form接收文件与参数,无需手动解析请求体:
from fastapi import FastAPI, File, UploadFile, Form @app.post("/summarize") async def get_summarize( files: list[UploadFile] = File(...), oneparamter: str = Form(...) ): # 示例处理逻辑:读取文件内容 file_content = await files[0].read() return {"received_param": oneparamter, "uploaded_file": files[0].filename}
请求端代码调整(可选)
原请求代码的params会将参数拼在URL中,若想把参数放到请求体而非URL,可替换为data参数:
response = requests.post( url=f'{os.environ["URL"]}/summarize', files=[('files', open(file[0].name, 'rb'))], data={"oneparamter": oneparamter} )
二、同时传输文件与大文本的解决方案
使用files参数时,请求格式为multipart/form-data,无法直接通过json参数传递数据(requests会强制将json内容转为multipart字段,处理繁琐)。推荐两种可行方案:
方案1:将大文本作为表单字段传输
直接把大文本放入data参数,与文件一起发送:
# 请求端代码 response = requests.post( url=f'{os.environ["URL"]}/summarize', files=[('files', open(file[0].name, 'rb'))], data={ "oneparamter": oneparamter, "large_text": "这里是超长的大文本内容,支持任意长度的字符串..." } )
FastAPI端点对应接收:
@app.post("/summarize") async def get_summarize( files: list[UploadFile] = File(...), oneparamter: str = Form(...), large_text: str = Form(...) ): return {"text_length": len(large_text), "file_name": files[0].filename}
方案2:大文本以文件形式上传
若文本体积极大,可将其写入临时文件后,与其他文件一同上传:
# 请求端代码 import tempfile # 写入大文本到临时文件 with tempfile.NamedTemporaryFile(mode='w', delete=False, encoding='utf-8') as temp_f: temp_f.write("GB级别的超大文本内容...") # 发送请求 response = requests.post( url=f'{os.environ["URL"]}/summarize', files=[ ('files', open(file[0].name, 'rb')), ('large_text_file', open(temp_f.name, 'rb')) ], data={"oneparamter": oneparamter} )
FastAPI端点接收:
@app.post("/summarize") async def get_summarize( files: list[UploadFile] = File(...), large_text_file: UploadFile = File(...), oneparamter: str = Form(...) ): # 读取并解码大文本 large_text = await large_text_file.read() large_text = large_text.decode('utf-8') return {"text_length": len(large_text), "file_name": files[0].filename}
内容的提问来源于stack exchange,提问作者M. Mariscal
相关产品推荐
相关产品推荐

