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

如何解决Flask应用中大文件上传失败的问题

Flask大文件上传报错(308/EPIPE)解决方案

问题根源分析

  1. 路由尾斜杠不匹配触发308重定向:你的路由定义为/files/upload_file/(带尾斜杠),但请求URL是/files/upload_file(不带尾斜杠),Flask会返回308永久重定向。POST请求在重定向过程中,大文件的multipart数据无法被正确重传,导致连接提前断开,出现EPIPE错误,同时文件字段丢失。
  2. curl命令语法错误:第一个curl命令的最后一个form参数多了一个单引号:--form 'file_name="my-great-file.mp4"'',这会导致请求格式异常,大文件场景下更容易触发错误。
  3. 内存读取大文件的风险:代码中file.read()一次性将整个文件读入内存,虽1.6MB不算极大,但后续若处理更大文件,会导致内存占用过高,也可能引发超时问题。

解决方案

1. 统一路由与请求的尾斜杠

两种方式二选一:

  • 修改路由定义,去掉尾斜杠:
@blueprint.route("/files/upload_file", methods=["POST"])  # 移除末尾的/
def upload_file():
    # 原有业务代码
  • 或修改curl请求的URL,添加尾斜杠:
curl --location --request POST 'http://192.168.1.217:5000/api/fileservice/0.1/files/upload_file/' \
--form 'mime_type="video/mp4"' \
--form 'uuid="12345"' \
--form 'file=@"/home/sean/Videos/long.mp4"' \
--form 'file_name="my-great-file.mp4"'

2. 修正curl命令的语法错误

删除最后一个form参数末尾多余的单引号,确保命令格式正确:

curl --location --request POST 'http://192.168.1.217:5000/api/fileservice/0.1/files/upload_file' \
--form 'mime_type="video/mp4"' \
--form 'uuid="12345"' \
--form 'file=@"/home/sean/Videos/long.mp4"' \
--form 'file_name="my-great-file.mp4"'

3. 配置Flask的文件大小限制

显式配置最大上传文件大小,避免默认限制或后续扩展问题:

# 在Flask应用初始化时添加
app.config['MAX_CONTENT_LENGTH'] = 64 * 1024 * 1024  # 设置为64MB,可按需调整

4. 优化文件读取方式(避免内存过载)

将一次性读取整个文件改为分块处理或先保存到磁盘,示例:

@blueprint.route("/files/upload_file", methods=["POST"])
def upload_file():
    print("test")
    form_data = flask.request.form
    file = flask.request.files.get("file")  # 使用get避免KeyError
    if not file:
        raise Exception("No file provided")

    # 方式1:先保存到磁盘再读取
    save_path = f"/tmp/{form_data['file_name']}"
    file.save(save_path)
    with open(save_path, 'rb') as f:
        byte_stream = f.read()

    # 方式2:分块读取(适合超大文件)
    # byte_stream = b''
    # chunk_size = 4096
    # while chunk := file.read(chunk_size):
    #     byte_stream += chunk

    request = FileCreateRequest(
        uuid=form_data["uuid"],
        file_name=form_data["file_name"],
        mime_type=form_data["mime_type"],
        bytes=byte_stream,
    )

    # 原有后续响应代码...

验证步骤

  1. 先修正curl命令的语法错误和URL尾斜杠问题,测试上传1.6MB文件。
  2. 若仍有问题,检查Flask的MAX_CONTENT_LENGTH配置是否生效。
  3. 最后优化文件读取逻辑,避免内存占用过高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:26:05