2016-03-03 20 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

ええ、ツールベルトのドキュメントには、あなたがそれを必要としていることが明示されています。 :) –

関連する問題