Boto reverse the stream



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

我遇到的问题是它们上传的方式,我需要提供一个可写的流,将传入的数据写入其中,要上传到boto,我需要一个可读的流。所以这就像我有两个不相连的末端。有没有一种方法可以用可写的流上传到s3?如果是这样的话,那就很容易了,我可以将上传流传递给s3,然后执行就会连锁起来。

如果没有,我有两个松散的末端,我需要一个缓冲区,它可以从上传中读取以保持移动,并公开一个读取方法,我可以给boto,以便它可以读取。但要做到这一点,我确信我需要线程s3上传部分,我宁愿避免,因为我使用扭曲。

我有一种感觉,我已经把事情复杂化了,但我无法想出一个简单的解决方案。这一定是一个常见的问题,我只是不确定如何很好地将其转化为单词来搜索

boto是一个带有阻塞API的Python库。这意味着你必须使用线程来使用它,同时保持Twisted为你提供的并发操作(就像你在使用boto"没有"Twisted时必须使用线程才能有任何并发性一样;即,Twisted无助于使boto成为非阻塞或并发的)。

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

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

您只需要将流包装在一个类似文件的对象中。因此,从本质上讲,流对象应该有一个读取方法,该方法会阻塞直到文件完全上传。

之后,您只需使用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)

相关内容

  • 没有找到相关文章

最新更新