Flask-RESTX多图片上传遇数据超限错误,求解决方案
Flask-RESTX 图片上传容量限制问题解决与多图上传实现
解决容量超限错误
你遇到的"The data value transmitted exceeds the capacity limit."错误,本质是Flask默认未配置或配置了过小的请求内容长度限制。只需在Flask应用中设置MAX_CONTENT_LENGTH即可解决,同时要处理对应异常以返回友好提示。
在app.py中添加配置:
from flask import Flask, jsonify from flask_restx import Api import os app = Flask(__name__) # 设置请求总容量上限为64MB,可根据业务需求调整 app.config['MAX_CONTENT_LENGTH'] = 64 * 1024 * 1024 # 指定上传文件存储目录 UPLOAD_FOLDER = 'uploads' app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER # 自动创建上传目录,避免报错 os.makedirs(UPLOAD_FOLDER, exist_ok=True) # 捕获容量超限异常,返回JSON格式错误 @app.errorhandler(413) def request_entity_too_large(error): return jsonify({"message": "上传文件总大小超出限制"}), 413 api = Api(app, version='1.0', title='图片上传API', description='支持多图片批量上传') # 导入上传命名空间 from nsUpload import ns_upload api.add_namespace(ns_upload) if __name__ == '__main__': app.run(debug=True)
实现多图片上传端点
在nsUpload.py中编写支持多文件上传的逻辑,利用Flask-RESTX的RequestParser并设置action='append'接收多个文件,同时做好文件安全校验和存储处理:
from flask_restx import Namespace, Resource, reqparse from werkzeug.utils import secure_filename from flask import current_app import os from datetime import datetime ns_upload = Namespace('upload', description='图片上传操作') # 定义多文件上传解析器 upload_parser = reqparse.RequestParser() upload_parser.add_argument( 'files', location='files', type=FileStorage, required=True, action='append', help='请选择要上传的图片文件(支持多选)' ) @ns_upload.route('/images') class BatchImageUpload(Resource): @ns_upload.expect(upload_parser) def post(self): args = upload_parser.parse_args() files = args.get('files') uploaded_results = [] # 允许的图片格式,可根据需求扩展 allowed_extensions = {'png', 'jpg', 'jpeg', 'gif'} for file in files: filename = secure_filename(file.filename) # 校验文件格式 if '.' not in filename or filename.rsplit('.', 1)[1].lower() not in allowed_extensions: return {"message": f"文件 {filename} 不是合法的图片格式"}, 400 # 生成唯一文件名,防止同名文件覆盖 timestamp = datetime.now().strftime('%Y%m%d%H%M%S') unique_filename = f"{timestamp}_{filename}" save_path = os.path.join(current_app.config['UPLOAD_FOLDER'], unique_filename) # 保存文件到指定目录 file.save(save_path) uploaded_results.append({ "original_name": filename, "saved_name": unique_filename, "save_path": save_path }) return { "message": "所有图片上传成功", "uploaded_files": uploaded_results }, 201
关键细节说明
- 容量限制:
MAX_CONTENT_LENGTH控制整个请求的总大小,多图上传时所有文件的总和不能超过这个值。 - 安全防护:用
secure_filename过滤文件名,避免路径遍历攻击;限制允许的图片格式,防止上传恶意文件。 - 避免文件覆盖:通过时间戳拼接原文件名,确保每个上传的文件都有唯一的存储名称。
- Swagger UI适配:
action='append'会让Swagger UI显示多文件选择控件,直接支持批量上传操作。
测试步骤
- 启动Flask应用,访问默认Swagger UI地址
http://localhost:5000/。 - 找到
upload命名空间下的/upload/images端点,点击Try it out。 - 在
files字段中选择多个图片文件,点击Execute。 - 正常情况下会返回201状态码和上传成功的详情,同时文件会保存在项目根目录的
uploads文件夹中。
内容的提问来源于stack exchange,提问作者White Slayer
相关产品推荐
相关产品推荐

