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

Flask服务器保存完整POST请求为二进制文件失败问题

解决Flask中保存完整POST原始请求二进制数据的问题

我完全懂你碰到的麻烦——先解析request.files后,再读原始请求数据就空了,直接用request.files写文件还报错。核心原因其实是Flask的请求体是一次性消费的:当你访问request.files、request.form这类解析后的属性时,Flask已经把整个请求流读取并解析成了对应的字典结构,此时请求流的指针已经移到末尾,再调用request.get_data()或者request.stream.read()自然读不到内容。而request.files本身是ImmutableMultiDict对象,不是二进制数据流,直接写入文件肯定会报类型错误。

下面是具体的解决方案:

关键修正步骤

  1. 先读取原始请求数据,再处理文件和元数据:把读取原始二进制数据的代码放在最前面,这样就能在请求体被解析前拿到完整的原始数据。
  2. 正确解析你的JSON元数据:因为你的客户端是把JSON作为multipart/form-data的一个字段发送的(放在files字典里的json项),所以服务器端要从request.files['json']中读取并解析,而不是用request.json。

修正后的服务器核心代码

from flask import Flask, request
from werkzeug.utils import secure_filename
import json
import os

app = Flask(__name__)

@app.route('/customerupdate',methods=['GET','POST'])
def customerupdate():
    # 第一步:先读取完整的原始POST请求二进制数据并保存
    bin_file_name = "raw_request.bin"
    raw_data = request.get_data()  # 这一步会缓存数据,不影响后续解析
    with open(bin_file_name, 'wb') as output_file_bin:
        output_file_bin.write(raw_data)
    
    # 第二步:再解析文件和JSON元数据
    # 保存上传的文件
    uploaded_file = request.files['file']
    if uploaded_file.filename != '':
        file_path = secure_filename(uploaded_file.filename)
        uploaded_file.save(file_path)
    
    # 解析JSON元数据
    json_part = request.files['json']
    metadata = json.loads(json_part.read())
    # 可以打印元数据验证
    print("解析到的元数据:", metadata)
    
    return "请求处理完成"

为什么这样能解决问题?

  • request.get_data()会读取整个请求体并缓存起来,后续访问request.files时,Flask会从缓存的原始数据中解析,而不是再次读取请求流,所以不会出现数据为空的情况。
  • 我们先保存原始数据,再处理业务逻辑,既满足了保存完整请求的需求,又不影响正常的文件和元数据解析。

额外注意点

  • 客户端发送的是multipart/form-data格式的请求,不是标准的application/json请求,所以不能用request.json来获取元数据,必须从request.files['json']中读取。
  • 如果你需要多次读取原始数据,request.get_data()默认会缓存结果,所以不用担心重复读取的问题;如果要强制重新读取,可以传cache=False参数,但一般不需要。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:12:29