13

aws-s3 のドキュメントには次のように書かれています。

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

しかし、たとえばバケットheashot.jpgからphotosバケットにコピーするにはどうすればよいですかarchive

ありがとう!

デブ

4

9 に答える 9

27

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})
于 2012-05-02T17:05:31.597 に答える
6

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ている場合ですbucketpicskey1234/yourfile.jpg

ここから答えを得ました: How do I copy files between buckets using s3 from a rails application?

于 2010-08-11T18:28:06.340 に答える
3

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

于 2013-07-19T13:44:04.757 に答える
3

まだ探している人のために、AWS にはこれに関するドキュメントがあります。実際には、aws-sdkgem を使用すると非常に簡単です。

bucket = Aws::S3::Bucket.new('source-bucket')
object = bucket.object('source-key')

object.copy_to(bucket: 'target-bucket', key: 'target-key')
于 2017-09-06T21:42:12.117 に答える
1

あるバケットから別のバケットにすべてのオブジェクトをコピーする単純な ruby​​ クラスを次に示します。

于 2016-05-10T23:22:05.870 に答える
0

私はあなたが抱えていたのと同じ問題に遭遇したので、AWS-S3のソースコードを複製し、バケット間でコピーできるメソッドを持つブランチを作成しcopy_toました。これは、プロジェクトにバンドルして、必要なときに使用しています。機能。うまくいけば、他の誰かがこれも役立つと思うでしょう。

GitHubでブランチを表示します

于 2013-02-01T00:19:16.463 に答える
0

aws-s3 gem には、ファイルをローカル マシンに移動せずにバケット間でファイルをコピーする機能がありません。それが受け入れられる場合は、次のように動作します。

AWS::S3::S3Object.store 'dest-key', open('http://url/to/source.file'), 'dest-bucket'
于 2011-08-18T23:55:20.607 に答える
0

バケット間でコピーするには、ソース バケットからファイルの内容を読み取り、アプリケーションのメモリ空間を介して宛先バケットに書き戻す必要があると思います。ここを使用してこれを示すスニペットと、aws-s3 ここを使用する別のアプローチがright_aws あります

于 2010-08-11T14:40:48.500 に答える