首页 > 解决方案 > 使用 python 请求发送的类文件数据

问题描述

我正在使用 python 请求将文件发送到 API

    files = [("file", open(path_to_file, 'rb'))]
    headers = {"Authorization": "bearer " + CLIENT.token}
    response = requests.request(
        "POST",
        SETTINGS.URL_FILE_STORAGE,
        headers=headers,
        files=files
        # files= [('file',catalogo)],
    )

这会抛出 202。但是,如果我将文件作为字节发送,那么 type(file) = BytesAPI 会抛出 500。将文件数据作为字节发送与将数据作为字节发送之间有什么联系open(path_file, 'rb')

标签: pythonrequestpython-requests

解决方案


您使用的是哪个版本的请求?在当前的主分支中,至少应该没有区别。如果您跟踪 中的files列表发生了什么requests.request,您会发现type 的参数strbytesbytearray作为 data 传递,而对于类似文件的对象,.read()则执行该方法并使用其结果。

因此,以下应产生与您的代码相同的请求:

    files = [("file", open(path_to_file, 'rb').read())] # Get file contents
    headers = {"Authorization": "bearer " + CLIENT.token}
    response = requests.request(
        "POST",
        SETTINGS.URL_FILE_STORAGE,
        headers=headers,
        files=files
        # files= [('file',catalogo)],
    )

如果 API 对这两个版本的响应不同,我会感到相当惊讶。

但如果是这样,并且您有bytes需要转换为类文件对象的类型的数据,您可以简单地使用io

import io
    files = [("file", io.BytesIO(data))]
    headers = {"Authorization": "bearer " + CLIENT.token}
    response = requests.request(
        "POST",
        SETTINGS.URL_FILE_STORAGE,
        headers=headers,
        files=files
        # files= [('file',catalogo)],
    )

推荐阅读