2016-03-03 132 views
6

我一直在四处寻找上传带有附加数据的大文件的方法,但似乎没有任何解决方案。要上传的文件,我已经使用这个代码已经和它一直工作正常,但文件:python请求上传带有附加数据的大文件

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) 

,但我需要添加{“复合”:“NONE”}的数据。如果没有,服务器将无法识别该文件。

+0

查看models.py,PreparedRequest类,prepare_body方法中的代码,没有办法使用请求来将上载大文件与其他数据进行流式传输。 –

回答

5

可以使用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) 

这将导致请求流的multipart/form-data上传给你。

+0

非常感谢!我记得之前遇到过请求 - 工具带,但没有想到将Content-Type放入标头! –

+0

是的,toolbelt的文档很明确地说你需要这个。 :) –