2015-04-06 21 views
5

Próbuję przesłać plik. Prosty plik hello.txt. Śledziłem dokumenty i nie mogę go przesłać do mojego kubełka.Przesyłanie pliku za pomocą zestawu SDK Ruby do Amazon S3

# START AWS CLIENT 

s3 = Aws::S3::Resource.new 
bucket = s3.bucket(BUCKET_NAME) 

begin 

    s3.buckets[BUCKET_NAME].objects[KEY].write(:file => FILE_NAME) 
    puts "Uploading file #{FILE_NAME} to bucket #{BUCKET_NAME}." 

    bucket.objects.each do |obj| 
    puts "#{obj.key} => #{obj.etag}" 
    end 

rescue Aws::S3::Errors::ServiceError 
    # rescues all errors returned by Amazon Simple Storage Service 
end 

byłem po http://docs.aws.amazon.com/AmazonS3/latest/dev/UploadObjSingleOpRuby.html

błędu:

➜ s3-tester ruby main.rb /Users/.rvm/gems/ruby-2.1.1/gems/aws-sdk-resources-2.0.34/lib/aws-sdk-resources/collection.rb:79:in 'method_missing: undefined method []' for ' <Aws::Resources::Collection:0x000001031e5100> (NoMethodError)' from 'main.rb:18:in <main> '

+0

jaki jest problem? –

+0

Otrzymuję błąd [] no method –

+0

Ok ... wpisz błąd w pytaniu. –

Odpowiedz

2
client = Aws::S3::Client.new(region: 'us-east-1') 
resource = Aws::S3::Resource.new(client: client) 
bucket = resource.bucket(BUCKET_NAME) 
begin 
    # s3.buckets[BUCKET_NAME].objects[KEY].write(:file => FILE_NAME) 
    # puts "Uploading file #{FILE_NAME} to bucket #{BUCKET_NAME}." 

    bucket.objects.each do |o| 
    puts o.key 
    end 

rescue Aws::S3::Errors::ServiceError 
    # rescues all errors returned by Amazon Simple Storage Service 
end 
+0

Nie mam problemów z połączeniem z S3. Ustawiłem swój region i kredyty. Nie mogę przesłać pliku. Prosty plik .. –

+0

Co chcesz zdefiniować s3, tak jak klient, a nie zasób –

+0

Próbowałem to w obie strony. –

7

Podstawowym problemem jest to, że masz wersję 2 AWS SDK dla zainstalowanego Ruby, ale odwołują dokumentacja dla wersji 1. Wersja 2 dokumentację można znaleźć tutaj:

http://docs.aws.amazon.com/sdkforruby/api/index.html

Aby zaktualizować przykład używać w wersji 2:

s3 = Aws::S3::Resource.new 
bucket = s3.bucket(BUCKET_NAME) 

begin 

    bucket.object(KEY).upload_file(FILENAME) 
    puts "Uploading file #{FILE_NAME} to bucket #{BUCKET_NAME}." 

    bucket.objects.each do |obj| 
    puts "#{obj.key} => #{obj.etag}" 
    end 

rescue Aws::S3::Errors::ServiceError 
    # rescues all errors returned by Amazon Simple Storage Service 
end 

różnic podstawowych:

  • Wersja 1 wykorzystała # [] metoda w kolekcji, aby odwoływać się do obiektu za pomocą jego klucza. Wersja 2 ma dwie metody: #objects() i #object(key). Ten ostatni jest geterem. Ten pierwszy wylicza wszystkie przedmioty w wiadrze.
  • Wersja 2 ma wyspecjalizowaną metodę #upload_file, która zarządza przesyłaniem obiektu z dysku. Jest to podobne do wersji #write od wersji 1, ale może również wykorzystywać wiele wątków do równoległego przesyłania dużych części obiektów.
1

Użyłem skryptu podobnego do następującego, który utworzyłby nowy element, jeśli nie istnieje, a następnie przesłał do niego wybrany plik.

#!/usr/bin/env ruby 
# 

require 'rubygems' 
require 'aws-sdk' 

bucket_name = ARGV[0] 
file_name = ARGV[1] 


# Get an instance of the S3 interface. 
s3 = Aws::S3::Client.new(region: 'us-east-1') 

key = File.basename(file_name) 
resp = s3.list_buckets() 
buckets = resp.data.buckets 

if buckets.select { |b| b.name == bucket_name }.length == 0 
    puts 'creating bucket' 
    s3.create_bucket(bucket: bucket_name) 
end 

puts "Uploading file #{file_name} to bucket #{bucket_name}..." 

# Upload a file. 
s3.put_object(
    :bucket => bucket_name, 
    :key => key, 
    :body => IO.read(file_name) 
) 

jeśli zapisane, że do upload.rb można przesłać simple.txt do my_bucket uruchamiając

$ ruby upload.rb my_bucket simple.txt

Powiązane problemy