如何使用rails应用程序中的s3在存储桶之间复制文件?

我目前正在开发一个rails应用程序,它试图在s3中将video从一个存储桶复制/移动到另一个存储桶。 但是我在rails应用程序上不断收到代理错误502。 在mongrel日志中,它说“未能分配内存”。 一旦发生此错误,应用程序就会死亡,我们必须重启。

好像你的代码正在将整个资源读入内存,而那些内存是你的应用程序的记忆。 一种天真的方式(从您的描述中,您已经做过类似的事情)将是下载文件并再次上传:只需将其下载到本地文件而不是内存。 但是,亚马逊工程师已经提前考虑并提供可以处理这种特定情况的API。

如果您正在使用类似RightAWS gem的东西,您可以使用它的S3Interface,如下所示:

# With s3 being an S3 object acquired via S3Interface.new # Copies key1 from bucket b1 to key1_copy in bucket b2: s3.copy('b1', 'key1', 'b2', 'key1_copy') 

如果您正在使用裸S3 HTTP接口,请参阅amazon的对象复制文档 ,以获得仅使用HTTP将一个对象从一个存储桶复制到另一个存储桶的解决方案。

尝试流文件,而不是将整个文件加载到内存中,然后使用它。

例如,如果您使用的是aws-s3 gem,请不要使用:

 data = open(file) S3Object.store file_name, data, BUCKET 

请改用以下内容:

 S3Object.store file_name, open(file), BUCKET 

不确定如何“流下载”文件。

boto效果很好。 看到这个post 。 使用boto,您可以将对象直接从一个存储桶复制到另一个存储桶,而不是将它们下载到本地计算机,然后将它们上载到另一个存储桶。

您可以使用雾gem直接将桶复制到桶中。

 s3 = Fog::Storage.new(your_aws_credentials) s3.copy_object('source-bucket', 'source/path', 'dest-bucket', 'dest/path')