Документация aws-s3 гласит:
# Copying an object
S3Object.copy 'headshot.jpg', 'headshot2.jpg', 'photos'
Но как скопировать heashot.jpg
из ведра photos
в ковш archive
, например
Спасибо!
Деб
Документация aws-s3 гласит:
# Copying an object
S3Object.copy 'headshot.jpg', 'headshot2.jpg', 'photos'
Но как скопировать heashot.jpg
из ведра photos
в ковш archive
, например
Спасибо!
Деб
Использование 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?
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, и необязательно для замены метаданных, связанных с объектом в процессе.
Стандартный метод (загрузка/выгрузка)
Метод копирования
Пример кода:
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})
При использовании 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
Вот простой класс ruby для копирования всех объектов из одного ведра в другое ведро: https://gist.github.com/edwardsharp/d501af263728eceb361ebba80d7fe324
Я считаю, что для копирования между ведрами вы должны прочитать содержимое файла из исходного кода, а затем записать его обратно в целевое ведро через пространство вашего приложения. Здесь показан фрагмент с использованием aws-s3
здесь и другого подхода с использованием right_aws
здесь
У aws-s3 gem нет возможности копировать файлы между ведрами без перемещения файлов на локальную машину. Если это приемлемо для вас, тогда будет работать следующее:
AWS::S3::S3Object.store 'dest-key', open('http://url/to/source.file'), 'dest-bucket'
Я столкнулся с той же проблемой, что и у вас, поэтому я клонировал исходный код для AWS-S3 и создал ветвь с методом copy_to
, которая позволяет копировать между ведрами, которые я связывал с моими проектами и использовать, когда мне нужна эта функциональность. Надеюсь, кто-то еще найдет это полезным.
Для тех, кто все еще смотрит, AWS имеет документацию для этого. Это действительно очень просто с камнем aws-sdk
:
bucket = Aws::S3::Bucket.new('source-bucket')
object = bucket.object('source-key')
object.copy_to(bucket: 'target-bucket', key: 'target-key')