2012-12-14 1 views
9

私はそれが動作する単一のファイルを実行します。sdkでS3を使用して「フォルダ」全体を別のパスにコピーする方法は?

aws_s3 = AWS::S3.new(S3_CONFIG) 
    bucket = aws_s3.buckets[S3_CONFIG["bucket"]] 

    object = bucket.objects["user/1/photos/image_1.jpg"] 
    new_object = bucket.objects["users/1/photos/image_1.jpg"] 
    object.copy_to new_object, {:acl => :public_read} 

しかし、私は、全体の「/写真」フォルダがNo Such Keyをスロー移動したいです。おそらくs3キーは各ファイルの完全なパスに過ぎません。どうやってするか?

aws_s3 = AWS::S3.new(S3_CONFIG) 
    bucket = aws_s3.buckets[S3_CONFIG["bucket"]] 

    object = bucket.objects["user/1/photos"] 
    new_object = bucket.objects["users/1/photos"] 
    object.copy_to new_object, {:acl => :public_read} 

ありがとうございます!

答えて

4

はそれをやった:

bucket.objects.with_prefix("user/1/photos").each do |object| 
    ... 
end 
+7

単純にコードを記述するのではなく、答えを説明することをお勧めします。これは、他のユーザーが類似しているが同一ではない問題を抱えている場合に役立ちます。 – Guvante

+0

説明はaws with_prefixを使用することです... – Luccas

+0

自動的に低品質の投稿としてフラグが立てられましたが、あなた自身の質問に答えていることに気付かなかった。 1つの方法は、APIドキュメントなど(リンク付き)からwith_prefixの使用法を引用することです。しかし、コードが質問に答えるのに十分であると信じるなら、この場合はあなたの質問です。 – Guvante

0

私はこの作業を取得するために追加のコードを必要としていました。基本的には、宛先プレフィックスにそれを追加し、元の接頭辞からベースを切り落とす:

def copy_files_s3(bucket_name, source, destination) 
    source_bucket = @s3.buckets[bucket_name] 
    source_bucket.objects.with_prefix(source).each do |source_object| 
    new_file_name = source_object.key.dup 
    new_file_name.slice! source 
    new_object = source_bucket.objects["#{destination}#{new_file_name}"] 
    source_object.copy_to new_object, {acl: :public_read} 
    end 
end 
1

A「フォルダ」キーが、フォルダでそれを得ることができない理由がある、S3内のオブジェクトではありませんパスは、実際には、フォルダに含まれるオブジェクトのすべてのキーの接頭辞です。

もう1つ重要なことは、キーをエンコードする必要があります。そうでないと、不明なキーエラーが発生する可能性があります。

require 'aws-sdk' 
require 'aws-sdk-s3' 
require 'securerandom' 
require 'uri' 
require "erb" 
include ERB::Util 

def copy_folder(folder, destination) 
    bucket_name = 'your_bucket' 
    credentials = Aws::Credentials.new('key', 'secret') 
    s3_client = Aws::S3::Client.new(region:'the_region', credentials: credentials) 
    enumerate_keys_with_prefix(source).each do |source_object| 
     source_key = url_encode(source_object.key) 
     destination_key = source_object.key.dup.sub(source, "") 
     s3_client.copy_object({bucket: bucket_name, copy_source: bucket_name+'/'+source_key, key: destination+'/'+destination_key, acl: "public-read"}) 
    end 
end 

def enumerate_keys_with_prefix(prefix) 
    bucket_name = 'your_bucket' 
    credentials = Aws::Credentials.new('key', 'secret') 
    s3 = Aws::S3::Resource.new(region:'the_region', credentials:credentials) 
    return s3.bucket(bucket_name).objects(prefix: prefix) 
end 
関連する問題