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

Flask在request.files为空时如何通过JSON数据实现文件上传

解决方案

你通过JSON格式传递文件数据,不属于标准的multipart/form-data文件上传请求,所以Flask不会将数据解析到request.files对象,走JSON通路处理是正确的,完整操作步骤如下:

1. Express 端预处理(必须调整)

JSON无法直接传输二进制Buffer数据,你需要先将文件Buffer转为Base64字符串后再放入JSON发送,否则数据会出现乱码丢失:

// 示例代码,获取上传文件后处理
const uploadFile = req.files.yourFileField;
const postData = {
  name: uploadFile.name,
  data: uploadFile.data.toString('base64'), // Buffer转base64字符串
  size: uploadFile.size,
  mimetype: uploadFile.mimetype,
  md5: uploadFile.md5
};
// 再把postData以JSON格式发送给Flask服务

2. Flask 端处理

场景1:直接保存文件到本地

import base64
from flask import request

# 拿到文件JSON数据
file_info = request.get_json(force=True)
# 解码Base64得到文件二进制原始数据
file_content = base64.b64decode(file_info['data'])
# 写入本地磁盘完成保存
save_path = f'./自定义存储目录/{file_info["name"]}'
with open(save_path, 'wb') as f:
    f.write(file_content)

场景2:需要封装为标准文件对象(适配依赖request.files的业务逻辑)

如果你的后续逻辑需要用到Werkzeug的FileStorage格式(也就是request.files里存储的对象类型),可以手动封装为标准文件对象:

import base64
from io import BytesIO
from werkzeug.datastructures import FileStorage
from flask import request

file_info = request.get_json(force=True)
file_content = base64.b64decode(file_info['data'])

# 封装为和request.files返回值完全一致的FileStorage对象
file_obj = FileStorage(
    stream = BytesIO(file_content),
    filename = file_info['name'],
    content_type = file_info['mimetype'],
    content_length = file_info['size']
)

# 之后就可以像使用request.files里的对象一样操作,比如直接调用save方法存储
file_obj.save(f'./自定义存储目录/{file_info["name"]}')

注意事项

  • 小文件用Base64传输没问题,大于10M的文件更建议Express直接以multipart/form-data格式转发请求,此时Flask可直接从request.files拿到文件,不需要额外编解码
  • Base64编码会让数据体积增加约33%,大文件场景会额外消耗带宽和内存

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:27:04