4

我有一个文件上传到的服务器,我希望能够使用 boto 将这些转发到 s3,我必须在数据上传到 s3 时对数据进行一些处理。

我遇到的问题是他们上传的方式我需要提供一个可写的流,传入数据被写入并上传到 boto 我需要一个可读的流。所以就像我有两个不连接的末端。有没有办法用可写流上传到 s3?如果是这样,那将很容易,我可以将上传流传递给 s3,它的执行将链接在一起。

如果没有我有两个松散的末端,我需要在它们之间有一些缓冲,它可以从上传中读取以保持移动,并公开一个我可以提供给 boto 以便可以读取的读取方法。但是这样做我确定我需要线程化 s3 上传部分,因为我使用的是扭曲的,所以我宁愿避免这样做。

我有一种感觉,我已经把事情复杂化了,但我想不出一个简单的解决方案。这必须是一个常见的问题,我只是不知道如何把它用词很好地搜索它

4

2 回答 2

3

boto 是一个带有阻塞 API 的 Python 库。这意味着您必须使用线程来使用它,同时维护 Twisted 为您提供的并发操作(就像您在使用 boto ''without'' Twisted 时必须使用线程来获得任何并发性一样;即,Twisted 没有帮助使 boto 非阻塞或并发)。

相反,您可以使用 txAWS,这是一个面向 Twisted 的库,用于与 AWS 进行交互。 txaws.s3.client提供与 S3 交互的方法。如果您熟悉 boto 或 AWS,其中一些应该已经很熟悉了。例如,create_bucketput_object

如果 txAWS 提供流式 API 会更好,这样您就可以在文件上传给您时上传到 S3。我认为这目前正在开发中(基于 Twisted 中的新 HTTP 客户端twisted.web.client.Agent),但可能尚未发布。

于 2012-10-03T20:12:57.257 回答
-1

您只需要将流包装在像 object 之类的文件中。所以本质上,流对象应该有一个 read 方法,该方法会阻塞直到文件完全上传。

之后,您只需使用 s3 API

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 回答