Flask上传超500KB文件时request.files为空,该如何解决?
解决Flask大文件上传时request.files为空的问题
问题根源是Flask依赖的Werkzeug默认限制请求体大小为500KB,超过该值的请求会被直接拒绝,导致request.files返回空。以下是具体解决方案:
1. 配置最大上传文件大小
在Flask应用初始化时,设置MAX_CONTENT_LENGTH参数,指定允许的最大文件大小(单位:字节)。根据你的图像识别需求调整数值,比如设置为16MB:
from flask import Flask app = Flask(__name__) # 允许最大16MB的文件上传,可根据实际需求修改 app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
2. 自定义超大文件错误响应
当文件大小超过限制时,Flask会返回413状态码,默认返回HTML页面,你可以自定义返回JSON格式的友好提示:
@app.errorhandler(413) def request_entity_too_large(error): return make_response(jsonify(status=413, message='文件大小超出限制(最大16MB)'), 413)
3. 优化控制器代码
增加文件存在性检查,避免因超大文件导致file为None时抛出异常,同时确保存储目录存在:
from flask import request, jsonify, make_response import os def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in {'png', 'jpg', 'jpeg'} def store_report(): try: file = request.files.get('file') # 检查文件是否存在(超大文件上传时会为空) if not file: return make_response(jsonify(status=400, message='未上传文件或文件大小超出限制'), 400) upload_path = './storage/' # 确保存储目录存在,不存在则自动创建 os.makedirs(upload_path, exist_ok=True) if allowed_file(file.filename): file.save(os.path.join(upload_path, file.filename)) return make_response(jsonify(status=200, message='上传成功'), 200) else: return make_response(jsonify(status=400, message='文件格式必须为png、jpg或jpeg'), 400) except Exception as e: return make_response(jsonify(message="文件存储失败", status=400), 400)
进阶方案:分块上传(针对GB级大文件)
如果需要支持几百MB甚至GB级的超大文件,单请求上传会受限于服务器和网络,建议采用分块上传:
- 前端将文件分割为多个固定大小的块(比如10MB/块)
- 后端逐个接收块,存储到临时目录
- 所有块上传完成后,后端将块拼接为完整文件
内容的提问来源于stack exchange,提问作者Briansay
相关产品推荐
相关产品推荐

