13

aws-s3 文档说:

  # Copying an object
  S3Object.copy 'headshot.jpg', 'headshot2.jpg', 'photos'

但是例如我如何heashot.jpgphotos存储桶复制到存储archive

谢谢!

德布

4

9 回答 9

27

AWS 开发工具包 gem。 S3Object#copy_to

Copies data from the current object to another object in S3.
S3 handles the copy so the client does not need to fetch the 
data and upload it again. You can also change the storage 
class and metadata of the object when copying.

它使用copy_object方法internal,因此复制功能允许您在 S3 存储桶内或之间复制对象,并可选择替换与该过程中的对象关联的元数据。

标准方法(下载/上传)

在此处输入图像描述

复制方法

在此处输入图像描述

代码示例:

require 'aws-sdk'

AWS.config(
  :access_key_id     => '***',
  :secret_access_key => '***',
  :max_retries       => 10
)

file     = 'test_file.rb'
bucket_0 = {:name => 'bucket_from', :endpoint => 's3-eu-west-1.amazonaws.com'}
bucket_1 = {:name => 'bucket_to',   :endpoint => 's3.amazonaws.com'}

s3_interface_from = AWS::S3.new(:s3_endpoint => bucket_0[:endpoint])
bucket_from       = s3_interface_from.buckets[bucket_0[:name]]
bucket_from.objects[file].write(open(file))

s3_interface_to   = AWS::S3.new(:s3_endpoint => bucket_1[:endpoint])
bucket_to         = s3_interface_to.buckets[bucket_1[:name]]
bucket_to.objects[file].copy_from(file, {:bucket => bucket_from})
于 2012-05-02T17:05:31.597 回答
6

使用right_aws宝石:

# 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')

我遇到的问题是,如果你有pics/1234/yourfile.jpgis bucketonlypics和 the keyis1234/yourfile.jpg

我从这里得到了答案:如何使用 Rails 应用程序中的 s3 在存储桶之间复制文件?

于 2010-08-11T18:28:06.340 回答
3

使用 AWS SDK gem 的 copy_from 或 copy_to 时,默认情况下不会复制三项内容:ACL、存储类或服务器端加密。您需要将它们指定为选项。

from_object.copy_to from_object.key, {:bucket => 'new-bucket-name', :acl => :public_read}

https://github.com/aws/aws-sdk-ruby/blob/master/lib/aws/s3/s3_object.rb#L904

于 2013-07-19T13:44:04.757 回答
3

对于仍在寻找的任何人,AWS 都有这方面的文档aws-sdkgem实际上非常简单:

bucket = Aws::S3::Bucket.new('source-bucket')
object = bucket.object('source-key')

object.copy_to(bucket: 'target-bucket', key: 'target-key')
于 2017-09-06T21:42:12.117 回答
2

使用 gem 可以轻松复制多个图像aws-sdk,如下所示:

require 'aws-sdk'

image_names = ['one.jpg', 'two.jpg', 'three.jpg', 'four.jpg', 'five.png', 'six.jpg']
Aws.config.update({
    region: "destination_region", 
    credentials: Aws::Credentials.new('AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY')
})
image_names.each do |img|
    s3 = Aws::S3::Client.new()
    resp = s3.copy_object({
      bucket: "destinationation_bucket_name", 
      copy_source: URI.encode_www_form_component("/source_bucket_name/path/to/#{img}"), 
      key: "path/where/to/save/#{img}" 
    })      
end

如果图像过多,建议将复制过程置于后台作业中。

于 2020-02-07T10:57:10.510 回答
1

这是一个简单的 ruby​​ 类,用于将所有对象从一个存储桶复制到另一个存储桶:https ://gist.github.com/edwardsharp/d501af263728eceb361ebba80d7fe324

于 2016-05-10T23:22:05.870 回答
0

我相信为了在存储桶之间进行复制,您必须从源存储桶中读取文件的内容,然后通过应用程序的内存空间将其写回目标存储桶。有一个片段显示了这个使用aws-s3 这里和另一种方法使用right_aws 这里

于 2010-08-11T14:40:48.500 回答
0

aws-s3 gem 无法在不将文件移动到本地计算机的情况下在存储桶之间复制文件。如果这对您来说是可以接受的,那么以下将起作用:

AWS::S3::S3Object.store 'dest-key', open('http://url/to/source.file'), 'dest-bucket'
于 2011-08-18T23:55:20.607 回答
0

我遇到了与您相同的问题,因此我克隆了 AWS-S3 的源代码并创建了一个分支,该分支具有copy_to允许在存储桶之间复制的方法,我一直将其捆绑到我的项目中并在需要时使用功能。希望其他人也会发现这也很有用。

查看 GitHub 上的分支

于 2013-02-01T00:19:16.463 回答