如何在Ruby on rails中使用AWS-S3或AWS-SDK gem跨存储桶复制文件

gblwokeq  于 2022-10-15  发布在  Ruby
关注(0)|答案(9)|浏览(219)

AWS-S3文档称:


# Copying an object

  S3Object.copy 'headshot.jpg', 'headshot2.jpg', 'photos'

但我如何将heashot.jpgphotos存储桶复制到archive存储桶
谢谢!
黛布

3qpi33ja

3qpi33ja1#

**AWS-SDK 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内部方法,因此复制功能允许您在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})
hpcdzsge

hpcdzsge2#

使用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.jpgbucket只有picskey1234/yourfile.jpg
我从这里得到答案:How do I copy files between buckets using s3 from a rails application?

gojuced7

gojuced73#

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

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

object.copy_to(bucket: 'target-bucket', key: 'target-key')
rn0zuynd

rn0zuynd4#

在使用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

dzhpxtsq

dzhpxtsq5#

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

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

如果您的图像太多,建议将复制过程放在后台作业中。

vlju58qv

vlju58qv6#

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

rkttyhzu

rkttyhzu7#

我认为,为了在存储桶之间进行复制,您必须从源存储桶中读取文件的内容,然后通过应用程序的内存空间将其写回目标存储桶。有一个使用aws-s3here的代码片段和另一个使用right_awshere的方法

dwthyt8l

dwthyt8l8#

AWS-S3 gem无法在不将文件移动到本地计算机的情况下在存储桶之间复制文件。如果这对你来说是可以接受的,那么下面的方法将会奏效:

AWS::S3::S3Object.store 'dest-key', open('http://url/to/source.file'), 'dest-bucket'
zd287kbt

zd287kbt9#

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

相关问题