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
相关产品推荐
相关产品推荐

