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

如何向FastAPI后端上传≥3GB大文件并解决422请求错误?

解决思路

1. 修复422字段缺失错误

出现422错误的核心原因是请求未正确设置Content-Type头,FastAPI无法识别请求为multipart/form-data格式,进而无法解析出upload_file字段。

修正客户端代码,添加对应请求头(直接复用MultipartEncoder的content_type属性):

file_name="afd.tgz"
m = MultipartEncoder(fields={"upload_file": open(file_name, 'rb')})
prefix = "http://xxx:5000"
url = "{}/v1/uploadfiles".format(prefix)
try:
    req = requests.post(
        url,
        data=m,
        headers={"Content-Type": m.content_type},  # 必须添加此行
        verify=False,
    )
    req.raise_for_status()  # 主动抛出HTTP错误便于排查问题
except Exception as e:
    print(f"上传失败: {e}")

同时需确认:

  • 客户端请求URL与服务器路由匹配:服务器路由为/uploadfiles,客户端请求的是/v1/uploadfiles,若服务器未挂载/v1子路径,需调整URL或修改服务器路由配置。

2. 确保大文件流式上传(不加载到内存)

服务器端处理

FastAPI的UploadFile默认采用流式处理,不会将整个文件加载到内存,只需分块写入磁盘即可:

from fastapi import FastAPI, File, UploadFile
import shutil

app = FastAPI()

@app.post("/uploadfiles")
async def uploadfiles(upload_file: UploadFile = File(...)):
    # 分块写入磁盘,避免占用过多内存
    with open(f"saved_{upload_file.filename}", "wb") as buffer:
        shutil.copyfileobj(upload_file.file, buffer)
    return {"filename": upload_file.filename}

shutil.copyfileobj默认以8KB块大小复制数据,不会一次性读取整个文件。

客户端确认

使用MultipartEncoder配合requests.post(data=m)本身就是流式上传模式,MultipartEncoder会逐块读取文件内容并发送,不会将3GB文件全部加载到内存,无需额外修改。

额外排查点

  • 确认服务器已安装python-multipart依赖:FastAPI解析multipart/form-data需要该包,执行pip install python-multipart完成安装。
  • 若文件超出默认请求大小限制,启动服务时可调整参数:uvicorn.run(app, host="0.0.0.0", port=5000, limit_max_requests=10*1024*1024*1024)(示例限制为10GB)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 11:45:58