【问题标题】:python requests upload large file with additional datapython请求上传带有附加数据的大文件
【发布时间】:2016-06-17 05:36:31
【问题描述】:

我一直在寻找上传带有附加数据的大文件的方法,但似乎没有任何解决方案。要上传文件,我一直在使用此代码,并且在处理小文件时效果很好:

with open("my_file.csv", "rb") as f:
    files = {"documents": ("my_file.csv", f, "application/octet-stream")}
    data = {"composite": "NONE"}
    headers = {"Prefer": "respond-async"}
    resp = session.post("my/url", headers=headers, data=data, files=files)

问题是代码在发送之前加载了整个文件,上传大文件时我会遇到 MemoryError。看了一圈,数据流的方式是设置

resp = session.post("my/url", headers=headers, data=f)

但我需要将 {"composite": "NONE"} 添加到数据中。否则,服务器将无法识别该文件。

【问题讨论】:

  • 查看models.py中的代码,PreparedRequest类,prepare_body方法,没有办法使用请求流式上传带有附加数据的大文件。
  • 你解决了吗?

标签: python file-upload python-requests large-file-upload


【解决方案1】:

您可以使用requests-toolbelt 来执行此操作:

import requests
from requests_toolbelt.multipart import encoder

session = requests.Session()
with open('my_file.csv', 'rb') as f:
    form = encoder.MultipartEncoder({
        "documents": ("my_file.csv", f, "application/octet-stream"),
        "composite": "NONE",
    })
    headers = {"Prefer": "respond-async", "Content-Type": form.content_type}
    resp = session.post(url, headers=headers, data=form)
session.close()

这将导致请求为您流式传输 multipart/form-data 上传。

【讨论】:

  • 非常感谢!我记得之前遇到过 requests-toolbelt,但没想到将 Content-Type 放到 header 中!
  • 是的,工具带的文档非常明确地表明您需要它。 :)
猜你喜欢
  • 2011-07-28
  • 2012-09-21
  • 2014-02-03
  • 1970-01-01
  • 2022-10-06
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
  • 1970-01-01
相关资源
最近更新 更多