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

Flask在PythonAnywhere上传100-200MB文件分片实现报413错误问询

问题根因定位

  • 你当前实现的是假分片逻辑:虽然按块读取了文件,但所有分片最终都拼接进了all_chunks变量,本质还是把整个100-200MB的文件加载到内存后一次性提交请求,请求体大小仍然超过平台100MB限制,自然会报413错误。
  • 你未调整Flask本身的上传大小限制:Flask默认的MAX_CONTENT_LENGTH配置如果小于你单次提交的大小,也会主动抛出413错误。
  • PythonAnywhere平台自带前端Nginx的100MB单请求体限制:即使调整了Flask配置,单请求超过100MB还是会被Nginx拦截返回413。

可行解决步骤

1. 调整Flask基础配置

在你的Flask实例初始化后添加以下配置,先放开框架层面的大小限制,仅针对单分片的大小配置即可,无需配置到200MB:

from flask import Flask
app = Flask(__name__)
# 单分片建议设为10MB,远小于平台100MB限制
app.config['MAX_CONTENT_LENGTH'] = 10 * 1024 * 1024

2. 重构分片上传逻辑,实现真正的逐分片提交

不要在本地把所有分片拼接后再提交,按以下两种业务场景调整即可:

场景1:外部用户上传文件到PythonAnywhere

  • 前端将大文件切分为10MB左右的分片,每个分片携带文件唯一标识、当前分片序号、总分片数三个参数,单独发送POST请求到后端
  • 所有分片上传完成后再发合并请求给后端
  • 后端接收单分片时直接写入临时目录,不用加载全部内容到内存;收到合并请求后,按分片序号依次拼接所有分片得到完整文件,再处理fastq文件的业务逻辑

场景2:把PythonAnywhere本地存储的fastq文件传到其他服务

不要把整个文件读入内存,逐分片发送请求,每次发完一个分片就清空内存即可:

import os
import requests

def upload_large_file(file_path, target_url, chunk_size=10*1024*1024):
    file_name = os.path.basename(file_path)
    file_size = os.path.getsize(file_path)
    total_chunks = file_size // chunk_size + (1 if file_size % chunk_size else 0)
    
    with open(file_path, 'rb') as f:
        for chunk_idx in range(total_chunks):
            chunk = f.read(chunk_size)
            # 每个分片单独发请求
            requests.post(
                target_url,
                data={
                    "file_name": file_name,
                    "chunk_idx": chunk_idx,
                    "total_chunks": total_chunks
                },
                files={"chunk": chunk}
            )
    # 所有分片发完后调用合并接口
    requests.post(f"{target_url}/merge", data={"file_name": file_name, "total_chunks": total_chunks})

这种实现每次请求的大小只有10MB,远低于PythonAnywhere的100MB限制,不会触发413错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 11:24:04