python请求上传带有附加数据的大文件
Posted
技术标签:
【中文标题】python请求上传带有附加数据的大文件【英文标题】:python requests upload large file with additional data 【发布时间】: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方法,没有办法使用请求流式上传带有附加数据的大文件。 你解决了吗? 【参考方案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 中! 是的,工具带的文档非常明确地表明您需要它。 :)以上是关于python请求上传带有附加数据的大文件的主要内容,如果未能解决你的问题,请参考以下文章
Alamofire 上传带有进度的大文件并在应用重启时显示进度
如何通过 Autodesk Forge 上的数据管理 API 上传超过 100MB 的大文件?
30分钟玩转.NET MVC 基于WebUploader的大文件分片上传断网续传秒传
转asp.net(c#)使用HttpWebRequest附加携带请求参数以post方式模拟上传大文件(以图片为例)到Web服务器端