クライアントの観点からは、簡単です。httplib
の低レベル インターフェイス <a href="http://docs.python.org/library/httplib.html#httplib.HTTPConnection.putrequest" rel="nofollow"> putrequest
、putheader
、endheaders
、および— を使用send
して送信できます。任意のサイズのチャンクでサーバーに送信したいものは何でも。
ただし、ファイルの終了位置も示す必要があります。
ファイルの合計サイズが事前にわかっている場合は、単純にContent-Length
ヘッダーを含めることができます。サーバーは、その数バイト後にリクエスト本文の読み取りを停止します。コードは次のようになります。
import httplib
import os.path
total_size = os.path.getsize('/path/to/file')
infile = open('/path/to/file')
conn = httplib.HTTPConnection('example.org')
conn.connect()
conn.putrequest('POST', '/upload/')
conn.putheader('Content-Type', 'application/octet-stream')
conn.putheader('Content-Length', str(total_size))
conn.endheaders()
while True:
chunk = infile.read(1024)
if not chunk:
break
conn.send(chunk)
resp = conn.getresponse()
事前に合計サイズがわからない場合、理論的な答えはチャンク転送エンコーディングです。問題は、応答には広く使用されていますが、要求には (同様に明確に定義されていますが) あまり一般的ではないように思われることです。ストック HTTP サーバーはそのままでは処理できない場合があります。ただし、サーバーも制御下にある場合は、リクエスト本文からチャンクを手動で解析し、それらを元のファイルに再構築してみてください。
もう 1 つのオプションはContent-Length
、同じ接続を介して各チャンクを個別の要求として ( を使用して) 送信することです。ただし、サーバーにカスタム ロジックを実装する必要があります。さらに、リクエスト間で状態を保持する必要があります。
2012-12-27 追加。チャンクされたリクエストを通常のリクエストに変換するnginxモジュールがあります。真のストリーミングを必要としない限り、役に立つかもしれません (クライアントが送信を完了する前にリクエストの処理を開始してください)。