2016-03-03 130 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的文檔很明確地說你需要這個。 :) –