Как скопировать файл между ведрами, используя гем aws-s3 - PullRequest
12 голосов
/ 11 августа 2010

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

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

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

Спасибо!

Деб

Ответы [ 8 ]

26 голосов
/ 02 мая 2012

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})
6 голосов
/ 11 августа 2010

Использование драгоценного камня 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.jpg, то bucket будет pics, а key - 1234/yourfile.jpg

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

3 голосов
/ 19 июля 2013

При использовании драгоценного камня AWS SDK 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

1 голос
/ 07 сентября 2017

Для тех, кто все еще ищет, 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')
1 голос
/ 11 мая 2016

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

0 голосов
/ 01 февраля 2013

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

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

0 голосов
/ 19 августа 2011

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

AWS::S3::S3Object.store 'dest-key', open('http://url/to/source.file'), 'dest-bucket'
0 голосов
/ 11 августа 2010

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

...