Как скопировать файл через ведра, используя драгоценный камень 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
Ответ 4
Вот простой класс ruby для копирования всех объектов из одного ведра в другое ведро: https://gist.github.com/edwardsharp/d501af263728eceb361ebba80d7fe324
Ответ 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')