2012-12-14 25 views
9

Khi tôi làm cho một tập tin duy nhất hoạt động:Làm thế nào để sao chép toàn bộ "thư mục" sang đường dẫn khác bằng S3 với sdk?

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} 

Nhưng tôi muốn di chuyển toàn bộ "/ ảnh" thư mục ném No Such Key. Có lẽ các khóa s3 chỉ là đường dẫn đầy đủ cho mỗi tệp. Làm thế nào để làm điều đó?

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} 

Cảm ơn!

Trả lời

4

lại làm điều đó:

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

Tốt nhất là cung cấp giải thích cho câu trả lời của bạn thay vì chỉ viết mã. Điều này cung cấp thông tin chi tiết bổ sung trong trường hợp người dùng khác có vấn đề tương tự nhưng không giống nhau. – Guvante

+0

giải thích là sử dụng aws with_prefix ... – Luccas

+0

Được tự động gắn cờ là bài đăng có chất lượng thấp, không nhận thấy rằng bạn đang trả lời câu hỏi của riêng bạn. Một cách là cung cấp báo giá về việc sử dụng with_prefix từ tài liệu API hoặc tương tự (có liên kết). Nhưng nếu bạn tin rằng mã là đủ để trả lời câu hỏi đó là câu hỏi của bạn trong trường hợp này. – Guvante

0

tôi cần mã bổ sung để làm việc này. Về cơ bản chặt các cơ sở từ tiền tố nguồn, sau đó thêm rằng các tiếp đầu ngữ đích đến:

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 "thư mục" không phải là một đối tượng trong S3, đó là lý do tại sao bạn không thể có được nó bằng chìa khóa, nhưng các thư mục đường dẫn thực sự là tiền tố cho tất cả các khóa của đối tượng chứa trong thư mục.

Một điều quan trọng khác là bạn phải mã hóa url các phím nếu không bạn có thể bị lỗi khóa không xác định.

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 
Các vấn đề liên quan