2012-12-14 14 views
9

Kiedy zrobić dla pojedynczego pliku to działa:Jak skopiować cały "folder" do innej ścieżki za pomocą S3 z 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} 

Ale chcę, aby przenieść cały „/ zdjęcia” Folder rzuca No Such Key. Prawdopodobnie klucze s3 są tylko pełną ścieżką dla każdego pliku. Jak to zrobić?

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} 

Dzięki!

Odpowiedz

4

Czy go:

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

Najlepiej podać wyjaśnienie swojej odpowiedzi, a nie tylko podać kod. Zapewnia to dodatkowy wgląd w przypadku, gdy inni użytkownicy mają podobny, ale nie identyczny problem. – Guvante

+0

wyjaśnieniem jest użycie aws with_prefix ... – Luccas

+0

Został automatycznie oznaczony jako post niskiej jakości, nie zauważyłem, że odpowiadasz na własne pytanie. Jednym ze sposobów jest podanie wyceny użycia with_prefix z dokumentu API lub podobnego (z linkiem). Ale jeśli uważasz, że kod jest wystarczający, aby odpowiedzieć na pytanie, to jest twoje pytanie w tym przypadku. – Guvante

0

potrzebowałem dodatkowy kod, aby dostać tę pracę. Zasadniczo odciąć podstawę od przedrostka źródłowego, a następnie dodać, że do prefiksu docelowego:

„folder”
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 nie jest obiekt w S3, dlatego nie można się go kluczem, ale folder ścieżka jest w rzeczywistości prefiksem dla wszystkich kluczy obiektów zawartych w folderze.

Inna ważna sprawa, musisz urodować kodowanie klawiszy, w przeciwnym razie możesz skończyć z nieznanym błędem klucza.

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 
Powiązane problemy