【问题标题】:Uploading a file using the Ruby SDK to Amazon S3使用 Ruby 开发工具包将文件上传到 Amazon S3
【发布时间】:2015-06-11 03:16:29
【问题描述】:

我正在尝试上传文件。一个简单的 hello.txt。我正在关注文档,但无法将其上传到我的存储桶。

#  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: 未定义的方法 []' 对于 '<Aws::Resources::Collection:0x000001031e5100> (NoMethodError)' 来自'main.rb:18:in <main>'

【问题讨论】:

  • 我得到 [] 无方法错误
  • 好的...把错误放在问题中。

标签: ruby amazon-web-services


【解决方案1】:

主要问题是您安装了适用于 Ruby 的 AWS 开发工具包的第 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,但它也可以使用多个线程并行上传大型对象部分。

【讨论】:

    【解决方案2】:

    我使用了一个类似下面的脚本,如果它不存在,它会创建一个新的存储桶,然后将选择的文件上传到它。

    #!/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 上传到 my_bucket

    $ ruby upload.rb my_bucket simple.txt

    【讨论】:

      【解决方案3】:
      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
      

      【讨论】:

      • 我连接到 S3 没有问题。我设置了我的区域和信誉。我无法上传文件。一个简单的文件..
      • 您想要将 s3 定义为客户端,而不是资源
      • 谢谢,但是... ➜ s3-tester ruby​​ main.rb main.rb:14:in &lt;main&gt;': undefined method buckets' for #<:s3::client> (NoMethodError)跨度>
      • 好的,我目前使用的是版本 1,我会寻求解决差异
      • ➜ s3-tester ruby​​ main.rb /Users/RJ/.rvm/gems/ruby-2.1.1/gems/aws-sdk-resources-2.0.34/lib/aws-sdk-资源/collection.rb:79:in method_missing': undefined method []' for #<:resources::collection:0x00000102d722f8> (NoMethodError) from main.rb:15:in `
        '
      猜你喜欢
      • 1970-01-01
      • 2015-08-09
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2012-11-28
      相关资源
      最近更新 更多