追加のデータを含む大きなファイルをアップロードする方法を探していましたが、解決策がないようです。ファイルをアップロードするために、私はこのコードを使用していて、小さなファイルで正常に動作しています:
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"}をデータに追加する必要があります。そうでない場合、サーバーはファイルを認識しません。
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
アップロードをストリーミングします。