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

如何在Flask中处理文件上传与嵌套JSON并发提交?

Flask 实现文件与嵌套JSON并发上传的方案

一、贴合Flask原生的推荐方案

不用把文件编码进JSON,直接利用multipart/form-data请求格式,将嵌套JSON转为字符串作为单独表单字段传递,文件按常规方式上传即可。这种方式符合HTTP标准,处理效率更高,也更适配Flask的请求逻辑。

客户端示例(JavaScript)

const formData = new FormData();
// 嵌套JSON转字符串作为表单字段
formData.append('metadata', JSON.stringify({
  user: {
    name: '张三',
    age: 25
  },
  tags: ['文档', '图片']
}));
// 添加待上传文件
formData.append('file', document.getElementById('fileInput').files[0]);

// 发送请求
fetch('/upload', {
  method: 'POST',
  body: formData
});

Flask服务端示例

from flask import Flask, request, jsonify
import json

app = Flask(__name__)

@app.route('/upload', methods=['POST'])
def upload():
    # 解析嵌套JSON字段
    metadata = json.loads(request.form.get('metadata'))
    # 获取上传的文件对象
    file = request.files.get('file')
    
    # 业务逻辑:保存文件、处理元数据
    if file:
        file.save(f'./uploads/{file.filename}')
    
    return jsonify({
        'status': 'success',
        'metadata': metadata,
        'filename': file.filename if file else None
    })

二、文件编码进JSON的方案(仅适合小文件场景)

如果必须用JSON承载所有数据,可将文件转为Base64编码字符串嵌入JSON,但这种方式会使文件体积增加约30%,传输和解析效率更低,仅推荐用于小文件场景。

客户端示例(JavaScript)

const fileInput = document.getElementById('fileInput');
const file = fileInput.files[0];

const reader = new FileReader();
reader.onload = function(e) {
    // 提取Base64格式的文件内容
    const base64File = e.target.result.split(',')[1];
    const payload = {
        metadata: {
            user: { name: '张三', age: 25 },
            tags: ['文档', '图片']
        },
        file: {
            filename: file.filename,
            content: base64File,
            contentType: file.type
        }
    };

    fetch('/upload-json', {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify(payload)
    });
};
reader.readAsDataURL(file);

Flask服务端示例

import base64
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/upload-json', methods=['POST'])
def upload_json():
    data = request.get_json()
    metadata = data.get('metadata')
    file_data = data.get('file')
    
    if file_data:
        # 解码Base64文件内容并保存
        file_content = base64.b64decode(file_data['content'])
        with open(f'./uploads/{file_data["filename"]}', 'wb') as f:
            f.write(file_content)
    
    return jsonify({
        'status': 'success',
        'metadata': metadata,
        'filename': file_data['filename'] if file_data else None
    })

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:22:41