python + requests:请求头('Content-Type': 'multipart/form-data'),并且files和其他参数均正确定义,但是文件上传一直失败,需要使用MultipartEncoder

解释

1. 在使用'Content-Type': 'multipart/form-data'上传文件时,你需要将文件作为请求体的一部分进行传输。而由于文件可能非常大,因此需要将文件分成多个部分进行传输。这就需要使用多部分编码(Multipart Encoding)来将文件分割成多个部分,并将每个部分与其它的表单数据一起打包到一个请求体中。
2. MultipartEncoder是一个Python库,它可以将请求体分割成多个部分,并为每个部分添加必要的头信息。这样,你就可以将请求体作为一个整体进行上传,而不必手动将其分割成多个部分。使用MultipartEncoder可以方便地处理文件上传时的多部分编码,因此它是上传文件时的常用工具之一。
3. 因此,在使用'Content-Type': 'multipart/form-data'上传文件时,你需要使用MultipartEncoder将请求体包装起来,以便服务器能够正确地解析请求体并处理文件内容。

代码示例 (方式一)

from requests_toolbelt.multipart.encoder import MultipartEncoder
import requests

def test_files():
    url = "https://../all/versions?abortWhenHeartbeatException=yes"

    files = ('zc_test_1.0.process.zip',
             open('/Users/.../resource/zc_test_1.0.process.zip', 'rb'),
             'application/octet-stream')

    payload = {
        # ...
        "studioVersion": "13.6.0-13.6.0%0D",
        "visualVars": "%5B%5D",
        "outputParams": "%5B%5D",
        "file": files,
    }
    headers = {
        'x-referer': '**',
        'x-version': '13.6.0',
        'Accept-Language': 'zh-CN',
        'Authorization': '***',
        'X-Tenant': ''
    }

    mutipart_encoder = MultipartEncoder(fields=payload)
    headers['Content-Type'] = mutipart_encoder.content_type
    response = requests.request("POST", url, headers=headers, data=mutipart_encoder)
    print(response.text)

代码示例(方式二)

  def test_files():
      url = "https://../versions?abortWhenHeartbeatException=yes"

      files = {
          "file": (
              'zc_test_1.0.process.zip', open('/Users/../resource/zc_test_1.0.process.zip', 'rb'), 'application/zip')

      }
      payload = {
          # ...
          "studioVersion": "13.6.0-13.6.0%0D",
          "visualVars": "%5B%5D",
          "outputParams": "%5B%5D",
      }
      headers = {
          'x-referer': '**',
          'x-version': '13.6.0',
          'Accept-Language': 'zh-CN',
          'Authorization': '**',
          'X-Tenant': '**',
      }
      response = requests.request("POST", url, headers=headers, data=payload, files=files)
      print(response.text)
posted @ 2023-06-30 19:55  To_Ann  阅读(825)  评论(0编辑  收藏  举报