9

私が単一のファイルに対して行うとき、それは機能します:

    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}

しかし、「/photos」フォルダ全体を移動したいのですが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

3 に答える 3

5

それをやった:

bucket.objects.with_prefix("user/1/photos").each do |object|
   ...
end
于 2012-12-14T20:03:02.520 に答える
1

これを機能させるには、追加のコードが必要でした。基本的に、送信元プレフィックスからベースを切り取り、それを送信先プレフィックスに追加します。

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
于 2015-10-27T08:14:49.253 に答える
1

「フォルダー」は S3 のオブジェクトではないため、キーで取得することはできませんが、フォルダー パスは実際には、フォルダーに含まれるオブジェクトのすべてのキーのプレフィックスです。

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

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
于 2018-03-05T14:52:31.733 に答える