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
相关产品推荐
相关产品推荐

