【问题标题】:File-like data sent using python requests使用 python 请求发送的类文件数据
【发布时间】:2022-01-11 23:23:43
【问题描述】:

我正在使用 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) = Bytes API 会抛出 500。将文件数据发送为 open(path_file, 'rb') 与将数据发送为字节之间有什么联系?。

【问题讨论】:

    标签: python request python-requests


    【解决方案1】:

    您使用的是哪个版本的请求?在当前的主分支中,至少应该没有区别。如果您追踪requests.request 中的files 列表发生了什么,您会发现arguments of type str, bytes and bytearray get passed through as 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)],
        )
    

    【讨论】:

    • 感谢您的回答!!,问题出在 API 中,因为当我将文件作为字节发送时,请求试图猜测文件名(及其扩展名),在字节模式下名称被设置为“文件”,API 只支持特定的扩展,然后它就倒下了。我本来希望收到另一种类型的错误,我不知道 415?非常感谢
    • 嗯,有道理。很高兴你知道了!
    • 我很困惑:两个代码 sn-ps 中是否有错字?在第 0 行:看起来您打开了一个圆括号,但忘记关闭它。
    • @HAL9000 是的,这是从问题代码中复制的拼写错误。应该是列表中的元组。
    • 好的,很好:错字已修复
    猜你喜欢
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 2014-08-29
    • 2011-09-18
    • 2016-06-16
    • 1970-01-01
    相关资源
    最近更新 更多