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
ありがとう!
デブ
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メソッドinternalを使用するため、コピー機能により、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
宝石の使用:
# 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')
私が遭遇した落とし穴は、あなたがis onlyとisを持っpics/1234/yourfile.jpg
ている場合ですbucket
pics
key
1234/yourfile.jpg
ここから答えを得ました: How do I copy files between buckets using s3 from a rails application?
AWS SDK gem の copy_from または copy_to を使用する場合、デフォルトではコピーされないものが 3 つあります: 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
まだ探している人のために、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')
あるバケットから別のバケットにすべてのオブジェクトをコピーする単純な ruby クラスを次に示します。
私はあなたが抱えていたのと同じ問題に遭遇したので、AWS-S3のソースコードを複製し、バケット間でコピーできるメソッドを持つブランチを作成しcopy_to
ました。これは、プロジェクトにバンドルして、必要なときに使用しています。機能。うまくいけば、他の誰かがこれも役立つと思うでしょう。
aws-s3 gem には、ファイルをローカル マシンに移動せずにバケット間でファイルをコピーする機能がありません。それが受け入れられる場合は、次のように動作します。
AWS::S3::S3Object.store 'dest-key', open('http://url/to/source.file'), 'dest-bucket'