Как скопировать файл через ведра с помощью aws-s3 gem

в документации aws-s3 говорится:

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

но как мне скопировать heashot.jpg С photos ведро archive например ведро

спасибо!

Деб

8 ответов


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 и, при необходимости, заменять метаданные, связанные с объектом в процессе.

стандартный метод (загрузка / выгрузка)

enter image description here

копировать метод

enter image description here

код:

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})

С помощью right_aws gem:

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

gotcha я столкнулся с тем, что если у вас есть pics/1234/yourfile.jpg на bucket только pics и key is 1234/yourfile.jpg

я получил ответ здесь: Как скопировать файлы между ведрами с помощью s3 из приложения rails?


при использовании copy_from или copy_to AWS SDK gem по умолчанию не копируются три вещи: 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


вот простой класс ruby для копирования всех объектов из одного ведра в другое ведро:https://gist.github.com/edwardsharp/d501af263728eceb361ebba80d7fe324


Я считаю, что для копирования между ведрами вы должны прочитать содержимое файла из исходного ведра, а затем записать его обратно в целевое ведро через пространство памяти вашего приложения. Есть фрагмент, показывающий это с помощью aws-s3 здесь и другой подход, используя right_aws здесь


драгоценный камень aws-s3 не имеет возможности копировать файлы между ведрами без перемещения файлов на локальный компьютер. Если это приемлемо для вас, то будет работать следующее:

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

я столкнулся с той же проблемой, что и вы, поэтому я клонировал исходный код для AWS-S3 и сделал ветку с copy_to метод, который позволяет копировать между ведрами, которые я связываю в свои проекты и использую, когда мне нужна эта функциональность. Надеюсь, кто-то еще найдет это полезным.

просмотр ветки на GitHub.


для тех, кто все еще ищет, AWS имеет документация для этого. Это на самом деле очень просто с aws-sdk gem:

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

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