我一直在寻找使用其他数据上传大文件的方法,但似乎没有任何解决方案。要上传文件,我一直在使用这个代码,并且它与小文件一起正常工作:
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”}。如果没有,服务器将无法识别该文件。
答案 0 :(得分:8)
您可以使用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
上传内容。