python请求上载包含附加数据的大型文件

python请求上载包含附加数据的大型文件,python,file-upload,python-requests,large-file-upload,Python,File Upload,Python Requests,Large File Upload,我一直在寻找上传带有附加数据的大文件的方法,但似乎没有任何解决方案。为了上传文件,我一直在使用这段代码,它可以很好地处理小文件: with open("my_file.csv", "rb") as f: files = {"documents": ("my_file.csv", f, "application/octet-stream")} data = {"composite": "NONE"} headers = {"Prefer": "respond-async"}

我一直在寻找上传带有附加数据的大文件的方法,但似乎没有任何解决方案。为了上传文件,我一直在使用这段代码,它可以很好地处理小文件:

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”}。否则,服务器将无法识别该文件。

您可以使用:

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()

这将导致请求为您流式传输
多部分/表单数据
上载。

查看models.py、PreparedRequest类、prepare_body方法中的代码,无法使用请求流式传输上载包含其他数据的大文件。您解决了吗?非常感谢!我记得以前遇到过toolbelt请求,但没有想到将内容类型放在标题中!是的,工具带的文档非常明确地说你需要它。:)