首页 > 解决方案 > 使用 Python 和使用请求的 API 的 multipart/form-data 问题

问题描述

我在尝试通过 multipart/form-data 上传文件时遇到问题。问题不在于请求/工具带,而是我正在使用的 API(是一个主要使用对名为 Mercado Libre 的特定平台的请求的 API,类似于 Ebay)。

我正在发布相关代码:

API的具体方法:

def post(self, path, body=None, params=None, extra_headers=None):
    params = params or {}
    headers = {'Accept': 'application/json', 'User-Agent':self.SDK_VERSION, 'Content-type':'application/json'}
    if extra_headers:
        headers.update(extra_headers)
    uri = self.make_path(path)
    if body:
        body = json.dumps(body)

    response = self._requests.post(uri, data=body, params=urlencode(params), headers=headers)
    return response

我的代码:

from requests_toolbelt import MultipartEncoder

encoder = MultipartEncoder(
    fields={
        'file': (
        'myfile.txt',
            open('/tmp/myfile.txt', 'rb'),
            'text/plain'
        )
    }
)

self.post(path='the-url-path', body=encoder, extra_headers={'Content-type': encoder.content_type})

当然这会给出一个错误,因为方法行:body = json.dumps(body):

TypeError:“MultipartEncoder”类型的对象不是 JSON 可序列化的

我做错了什么或如何解决这个问题?

提前致谢。

标签: pythonpython-requests

解决方案


您需要使用以下with关键字对文件进行一些不同的操作:

from requests_toolbelt import MultipartEncoder
with open('/tmp/myfile.txt', 'rb') as f:
    encoder = MultipartEncoder(
        fields={
            'file': (
            'myfile.txt',
                f,
                'text/plain'
            )
        }
    )

    self.post(path='the-url-path', body=encoder, extra_headers={'Content-type': encoder.content_type})

推荐阅读