7

ファイルをURLにアップロードしたい。アップロードしたいファイルは自分のコンピューターにはありませんが、ファイルの URL は知っています。requests ライブラリを使用してアップロードしたい。だから、私はこのようなことをしたい:

url = 'http://httpbin.org/post'
files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=files)

しかし、唯一の違いは、ファイル report.xls が私のコンピューターにない URL からのものであることです。

4

3 に答える 3

13

これを行う唯一の方法は、URL の本文をダウンロードしてアップロードできるようにすることです。

問題は、 を取るフォームがfileHTTP POST でファイルの本体を予期していることです。代わりに URL を受け取り、それ自体でフェッチを行うフォームを作成することもできますが、それは、ファイルを受け取るものとは異なるフォームと要求になるでしょう (または、オプションのファイルとオプションの URL)。

もちろん、ダウンロードしてファイルに保存する必要はありません。メモリにダウンロードするだけです:

urlsrc = 'http://example.com/source'
rsrc = requests.get(urlsrc)
urldst = 'http://example.com/dest'
rdst = requests.post(urldst, files={'file': rsrc.content})

もちろん、場合によっては、常にファイル名やContent-Type. または、巨大なファイルの場合、ファイル全体を一度にダウンロードしてからアップロードすることなく、あるサーバーから別のサーバーにストリーミングしたい場合があります。そのようなことはすべて手動で行う必要がありますが、ほとんどすべてが簡単でrequests、ドキュメントで詳しく説明されています。


* そうですね、最後の例は簡単readではありません… リクエストやリクエストから raw ソケットラッパーを取得し、writeデッドロックしないようにする必要があります…</p>

于 2013-08-29T18:04:55.457 に答える