4

ファイルがアップロードされるサーバーがあります。botoを使用してこれらをs3に転送できるようにしたいのですが、基本的にs3にアップロードされるときにデータに対して何らかの処理を行う必要があります。

私が抱えている問題は、それらがアップロードされる方法です。受信データが書き込まれる書き込み可能なストリームを提供する必要があり、botoにアップロードするには読み取り可能なストリームが必要です。つまり、接続されていない2つの端があるようなものです。書き込み可能なストリームを使用してs3にアップロードする方法はありますか?もしそうなら、それは簡単で、アップロードストリームをs3に渡すことができ、実行は連鎖します。

ある種のバッファの間に何かが必要な2つのルーズエンドがない場合は、アップロードから読み取って移動を続け、botoに渡して読み取ることができるreadメソッドを公開します。しかし、これを行うには、ツイストを使用しているので避けたいs3アップロード部分をスレッド化する必要があると確信しています。

物事を複雑にしすぎているような気がしますが、簡単な解決策を思いつくことはできません。これは一般的な問題である必要があります、私はそれを検索するためにそれを単語にうまく入れる方法がわかりません

4

2 に答える 2

3

botoは、ブロッキングAPIを備えたPythonライブラリです。これは、Twistedが提供する同時実行操作を維持しながら、スレッドを使用する必要があることを意味します(boto'' without'' Twistedを使用するときにスレッドを使用して並行性を持たせる必要があるのと同じです。つまり、Twistedは使用しません。 botoを非ブロッキングまたは同時にするのに役立ちます)。

代わりに、AWSとやり取りするためのツイスト指向のライブラリであるtxAWSを使用できます。 txaws.s3.clientS3と対話するためのメソッドを提供します。botoまたはAWSに精通している場合、これらのいくつかはすでに精通しているように見えるはずです。たとえば、create_bucketまたはput_object

txAWSは、ファイルがアップロードされているときにS3にアップロードできるように、ストリーミングAPIを提供する方がよいでしょう。これは現在開発中であると思います(Twistedの新しいHTTPクライアントに基づいてtwisted.web.client.Agentいます)が、リリースではまだ利用できない可能性があります。

于 2012-10-03T20:12:57.257 に答える
-1

ストリームをオブジェクトのようなファイルにラップする必要があります。したがって、基本的に、ストリームオブジェクトには、ファイルが完全にアップロードされるまでブロックするreadメソッドが必要です。

その後、s3APIを使用するだけです

bucketname = 'my_bucket'
conn = create_storage_connection()
buckets = conn.get_all_buckets()
bucket = None
for b in buckets:
    if b.name == bucketname:
        bucket = b
if not bucket:
    raise Exception('Bucket with name ' + bucketname + ' not found')
k = Key(bucket)
k.key = key
k.set_contents_from_filename(MyFileLikeStream)
于 2012-10-03T20:07:58.123 に答える