阅读(687) (1)

httpx 多部分文件编码

2022-07-21 15:59:34 更新

快速入门中所述,可以通过将包含有效负载名称的字典作为键传递,并将元素元组或类似文件的对象或字符串作为值来使用多部分文件编码。

>>> files = {'upload-file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel')}
>>> r = httpx.post("https://httpbin.org/post", files=files)
>>> print(r.text)
{
  ...
  "files": {
    "upload-file": "<... binary content ...>"
  },
  ...
}

更具体地说,如果将元组用作值,则它必须具有 2 到 3 个元素:

  • 第一个元素是可选文件名,可以设置为​None ​。
  • 第二个元素可以是类似文件的对象或字符串,它将以​ UTF-8 ​自动编码。
  • 可选的第三个元素可用于指定要上载的文件的 MIME 类型。如果未指定,HTTPX 将尝试根据文件名猜测 MIME 类型,未知文件扩展名默认为“​application/octet-stream​”。如果文件名显式设置为​None​,则 HTTPX 将不包含内容类型 MIME 标头字段。
>>> files = {'upload-file': (None, 'text content', 'text/plain')}
>>> r = httpx.post("https://httpbin.org/post", files=files)
>>> print(r.text)
{
  ...
  "files": {},
  "form": {
    "upload-file": "text-content"
  },
  ...
}
提示
以这种方式上传大文件是安全的。默认情况下,文件上传是流式传输的,这意味着一次只有一个块将加载到内存中。

通过将非文件数据字段传递给​data=... ​,可以使用它们包含在多部分表单中。

您还可以使用多文件字段表单一次性发送多个文件。为此,请传递​(field, <file>)​项目列表而不是字典,从而允许您传递具有相同​field ​.例如,此请求发送 2 个文件,​foo.png​和​bar.png​并在images表单字段上的一个请求中发送:

>>> files = [('images', ('foo.png', open('foo.png', 'rb'), 'image/png')),
                      ('images', ('bar.png', open('bar.png', 'rb'), 'image/png'))]
>>> r = httpx.post("https://httpbin.org/post", files=files)