3

requestsモジュールを使用して、次のようなバイナリ ファイル (jpg) をアップロードすることに成功しました。

upload_url = 'http:10.1.1.1:8080/api/media/photo'
headers = {'Authorization': token_string, 'Content-Type': 'image/jpg'}
data = open('photo.JPG', 'rb')
params = {'name': 'photo.JPG'}
r = requests.post(upload_url, params=params, data=data, headers=headers)

これをaiohttpクライアントで実行しようとしています。これは私がこれまでに持っているものです:

def upload_photos(token):
    upload_url = '10.0.1.1:8080/api/media/photo'
    headers = {'Authorization': token, 'Content-Type': 'image/jpg'}
    data = {'file': open('photo.JPG', 'rb')}
    params = {'name': 'photo.JPG'}
    r = yield from aiohttp.request('post', upload_url, params=params, data=data, headers=headers)

if __name__ == '__main__':     
    asyncio.get_event_loop().run_until_complete(upload_photos(token))

しかし、私は 400 を取り戻してい{"detail": "Specified value is invalid: Invalid Content-Length specified"}ます。
まるで、photo.jpg が適切に送信されていないかのようです。aiohttp のドキュメントでは、マルチパート エンコード ファイルとストリーミングについて言及されていますが、それは私がここで望んでいることではありません。

リクエストのようにバイナリファイルを使用して同様の POST を作成するにはどうすればよいですか?

4

1 に答える 1

0

バグ報告ありがとうございます。回避策として、チャンク転送エンコーディングを使用すると思います。

headers['Transfer-Encoding'] = 'chunked'
r = yield from aiohttp.request('post', upload_url, params=params, data=data, headers=headers, chunked=1024) 

レシピは機能するはずです。少なくとも、テスト スイートには非常によく似たコードがあります: https://github.com/KeepSafe/aiohttp/blob/master/tests/test_client_functional.py#L322

次の aiohttp リリースで、アップロード方法のContent-Length計算を修正しようと思います。

于 2015-04-02T15:32:47.167 に答える