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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 18:13:19