2015-04-06 35 views
5

Tôi đang cố gắng tải tệp lên. Một hello.txt đơn giản. Tôi đã theo dõi các tài liệu và tôi không thể tải nó lên thùng của mình.Tải tệp lên bằng Ruby SDK lên 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 

Tôi đã sau http://docs.aws.amazon.com/AmazonS3/latest/dev/UploadObjSingleOpRuby.html

Lỗi:

➜ 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

vấn đề này là gì? –

+0

Tôi nhận được lỗi [] không có lỗi –

+0

Ok ... đặt lỗi trong câu hỏi. –

Trả lời

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

Tôi không gặp sự cố khi kết nối với S3. Tôi đặt khu vực của tôi, và creds. Tôi không thể tải lên một tệp. Một tập tin đơn giản .. –

+0

Những gì bạn muốn xác định s3 là khách hàng, không phải tài nguyên –

+0

Tôi đã thử cả hai cách. –

7

Vấn đề chính là bạn có phiên bản 2 của AWS SDK cho Ruby cài đặt, nhưng bạn đang tham chiếu tài liệu cho phiên bản 1. Phiên bản 2 tài liệu có thể được tìm thấy ở đây:

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

Để cập nhật ví dụ của bạn để sử dụng phiên bản 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 

Sự khác biệt chính:

  • Phiên bản 1 sử dụng # [] phương pháp trên một bộ sưu tập để tham chiếu một đối tượng bằng khóa của nó. Phiên bản 2 có hai phương pháp, #objects()#object(key). Sau đó là getter. Trước đây liệt kê tất cả các đối tượng trong thùng.
  • Phiên bản 2 có phương pháp chuyên biệt #upload_file quản lý tải lên đối tượng từ đĩa. Điều này tương tự như #write từ phiên bản 1, nhưng nó cũng có thể sử dụng nhiều chủ đề để tải lên các phần đối tượng lớn song song.
1

Tôi đã sử dụng tập lệnh như sau sẽ tạo nhóm mới nếu nó không tồn tại và sau đó tải tệp đã chọn lên đó.

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

nếu bạn đã lưu để upload.rb bạn có thể tải lên simple.txt để my_bucket bằng cách chạy

$ ruby upload.rb my_bucket simple.txt

Các vấn đề liên quan