2015-04-06 117 views
5

我想上傳一個文件。一個簡單的hello.txt。我正在關注文檔,並且無法將其上傳到我的存儲區。上傳使用Ruby SDK文件到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 

我下面http://docs.aws.amazon.com/AmazonS3/latest/dev/UploadObjSingleOpRuby.html

錯誤:

➜ 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

有什麼問題MY_BUCKET? –

+0

我得到[]沒有方法錯誤 –

+0

好的...把錯誤的問題。 –

回答

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

我沒有問題連接到S3。我設定了我的地區,並聲稱。我不能上傳文件。一個簡單的文件.. –

+0

你想要什麼定義s3,因爲是客戶端,而不是資源 –

+0

我試過這兩種方式。 –

7

的主要問題是,你有AWS的SDK安裝了Ruby的第2版,但你引用版本1的文檔。第2版​​的文檔可以在這裏找到:

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

要更新您的示例使用的版本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 

的主要區別:

  • 1版使用#[]方法在集合上引用一個對象的密鑰。版本2有兩種方法,#objects()#object(key)。後者是吸氣劑。前者枚舉桶中的所有對象。
  • 版本2有一個專門的#upload_file方法,管理從磁盤上傳對象。這與版本1中的#write類似,但它也可以使用多個線程並行上傳大型對象部分。
1

我使用了類似以下的腳本,如果它不存在,就會創建一個新的存儲桶,然後將選定的文件上傳到它。

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

,如果你保存,爲您upload.rb可以上傳simple.txt運行

$ ruby upload.rb my_bucket simple.txt

相關問題