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

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显示多文件选择控件,直接支持批量上传操作。

测试步骤

  1. 启动Flask应用,访问默认Swagger UI地址http://localhost:5000/。
  2. 找到upload命名空间下的/upload/images端点,点击Try it out。
  3. 在files字段中选择多个图片文件,点击Execute。
  4. 正常情况下会返回201状态码和上传成功的详情,同时文件会保存在项目根目录的uploads文件夹中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 21:13:19