15

追加データを含む大きなファイルをアップロードする方法を探していましたが、解決策がないようです。ファイルをアップロードするために、私はこのコードを使用しており、小さなファイルでうまく機能しています:

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"} を追加する必要があります。そうでない場合、サーバーはファイルを認識しません。

4

1 に答える 1

16

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アップロードをストリーミングします。

于 2016-03-03T22:10:02.493 に答える