2015-04-06 41 views
5

Sto tentando di caricare un file. Un semplice hello.txt. Stavo seguendo i documenti e non riesco a caricarlo nel mio secchio.Caricamento di un file utilizzando Ruby SDK su 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 

Stavo seguendo http://docs.aws.amazon.com/AmazonS3/latest/dev/UploadObjSingleOpRuby.html

L'errore:

➜ 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

qual è il problema? –

+0

Ricevo un [] errore di metodo –

+0

Ok ... inserire l'errore nella domanda. –

risposta

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

Non ho problemi di connessione a S3. Ho impostato la mia regione e credenziali. Non posso caricare un file. Un semplice file .. –

+0

Quello che vuoi definire s3 come è il client, non la risorsa –

+0

L'ho provato in entrambi i modi. –

7

Il problema principale è che si ha la versione 2 della AWS SDK per installare Ruby, ma si fa riferimento la documentazione per la versione 1. documentazione versione 2 può essere trovato qui:

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

Per aggiornare il tuo esempio per utilizzare la versione 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 

Le differenze principali:

  • Versione 1 usato il # [] metodo su una raccolta per fare riferimento a un oggetto tramite la sua chiave. La versione 2 ha due metodi, #objects() e #object(key). Quest'ultimo è il getter. Il primo enumera tutti gli oggetti nel secchio.
  • La versione 2 ha un metodo specializzato #upload_file che gestisce il caricamento di un oggetto dal disco. È simile a #write dalla versione 1, ma può anche utilizzare più thread per caricare parti di oggetti di grandi dimensioni in parallelo.
1

Ho usato uno script simile al seguente che creava un nuovo bucket se non esiste e quindi carica il file scelto su di esso.

#!/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) 
) 

se è stato salvato che per upload.rb si potrebbe caricare simple.txt a my_bucket eseguendo

$ ruby upload.rb my_bucket simple.txt

Problemi correlati