当前位置: 代码迷 >> python >> python:requests,如何发布MULTIPART / FORM-DATA并传输大文件?
  详细解决方案

python:requests,如何发布MULTIPART / FORM-DATA并传输大文件?

热度:132   发布时间:2023-06-16 14:10:49.0

我需要在MULTIPART / FORM-DATA中发布.wav文件。

到目前为止,我的脚本是:

import requests
import json
import wave 

def get_binwave(filename):

    w = wave.open(filename, "rb")
    binary_data = w.readframes(w.getnframes())
    w.close()
    return binary_data


payload = {
    "operating_mode":"accurate",
    "model":{
       "name":"code"
    },
    "channels":{
        "first":{
            "format": "audio_format",
            "result_format": "lattice"
         }
     }
}

multiple_files = [
    ("json","application/json",json.dumps(payload)),
    ("first","audio/wave",str(get_binwave("c.wav")))]
r = requests.post("http://localhost:8080", files=multiple_files)

我面临两个问题:

  1. .wav文件二进制文件太大,因此我猜我需要对其进行流传输?

  2. 服务器期望边界为=“ xxx --------------- xxx”。 如何设置?

如何正确处理所有这些?

请求实际上并没有流式传输multipart/form-data上载(但是它将很快到达那里)。 在此之前, requests-toolbelt从PyPI安装requests-toolbelt 要使用它,您的脚本看起来像

import requests
import json
from requests_toolbelt.multipart import encoder


payload = {
    "operating_mode":"accurate",
    "model":{
       "name":"code"
    },
    "channels":{
        "first":{
            "format": "audio_format",
            "result_format": "lattice"
         }
     }
}

multiple_files = [
    ("json", "application/json", json.dumps(payload)),
    ("first", "audio/wave", open("c.wav", "rb"),
]
multipart_encoder = encoder.MultipartEncoder(
    fields=multiple_files,
    boundary="xxx---------------xxx",
)
r = requests.post("http://localhost:8080",
                  data=multipart_encoder,
                  headers={'Content-Type': multipart_encoder.content_type})

有关该库和MultipartEncoder的更多文档,请参见

  相关解决方案