2016-10-23 5 views
2

botocoreとaiohttpサービスを使用して、S3にアップロードされたファイルのコンテンツを取得したいと思います。ファイルが巨大なサイズがありとおり:aiobotocore-aiohttp - S3ファイルのコンテンツを取得し、それを応答でストリームします

  • を私はaiohttp、aiobotocore(S3からファイルをダウンロードしながら他の要求を処理できるようにしたい
  • 、メモリ内のファイル全体の内容を保存する必要はありません)、
  • 私は私がダウンロードしたファイルに変更を適用することができるようにしたいので、私はラインでそれをラインを治療し、今のクライアント

への応答をストリーミングしたい、私は、次のコードを持っています私のaiohttpハンドラ:

import asyncio         
import aiobotocore        

from aiohttp import web       

@asyncio.coroutine        
def handle_get_file(loop):      

    session = aiobotocore.get_session(loop=loop) 

    client = session.create_client(    
     service_name="s3",      
     region_name="",       
     aws_secret_access_key="",    
     aws_access_key_id="",     
     endpoint_url="http://s3:5000"   
    )           

    response = yield from client.get_object( 
     Bucket="mybucket",      
     Key="key",        
    )           

与えられたファイルから1行を読み込むたびに、私は応答を送りたいと思います。実際、get_object()は内部にBody(ClientResponseContentProxyオブジェクト)を持つdictを返します。メソッドread()を使用して、予想される応答のチャンクを取得してクライアントにストリームするにはどうすればよいですか?

私は:

for content in response['Body'].read(10): 
    print("----")       
    print(content)   

ループ内のコードが実行されることはありません。

しかし、私はやるとき:

result = yield from response['Body'].read(10) 

私は結果内のファイルの内容を取得します。私はここでread()を使う方法についてちょっと混乱しています。

おかげ

答えて

1

aiobotocore APIはbotocoreの1と異なっているので、それはあなたが

から、それは(https://github.com/aio-libs/aiobotocore/pull/19から取られた)そのような何かに見える得るために必要があるためFlowControlStreamReader.readジェネレータを返しread()ここで、だ

resp = yield from s3.get_object(Bucket='mybucket', Key='k') 
stream = resp['Body'] 
try: 
    chunk = yield from stream.read(10) 
    while len(chunk) > 0: 
     ... 
     chunk = yield from stream.read(10) 
finally: 
    stream.close() 

と、実際にあなたのケースであなたもreadline()

を使用することができます

https://github.com/KeepSafe/aiohttp/blob/c39355bef6c08ded5c80e4b1887e9b922bdda6ef/aiohttp/streams.py#L587

+0

ありがとうございました。 – jean553

関連する問題