Как скопировать файл через ведра, используя драгоценный камень aws-s3

Документация aws-s3 гласит:

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

Но как скопировать heashot.jpg из ведра photos в ковш archive, например

Спасибо!

Деб

Ответ 1

Использование 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')

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

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

Ответ 2

AWS-SDK. 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})

Ответ 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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

Открыть ветку на GitHub.

Ответ 8

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

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

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