Как скопировать файл через ведра с помощью 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 и, при необходимости, заменять метаданные, связанные с объектом в процессе.
стандартный метод (загрузка / выгрузка)
копировать метод
код:
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 не имеет возможности копировать файлы между ведрами без перемещения файлов на локальный компьютер. Если это приемлемо для вас, то будет работать следующее:
AWS::S3::S3Object.store 'dest-key', open('http://url/to/source.file'), 'dest-bucket'
я столкнулся с той же проблемой, что и вы, поэтому я клонировал исходный код для AWS-S3 и сделал ветку с copy_to
метод, который позволяет копировать между ведрами, которые я связываю в свои проекты и использую, когда мне нужна эта функциональность. Надеюсь, кто-то еще найдет это полезным.
для тех, кто все еще ищет, 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')