【问题标题】:http PUT a file to S3 presigned URLs using rubyhttp 使用 ruby​​ 将文件放入 S3 预签名 URL
【发布时间】:2010-09-10 13:09:38
【问题描述】:

任何人都有一个使用 ruby​​ 发布到 s3 上的预签名 URL 的工作示例

【问题讨论】:

  • 请发布您找到的解决方案。

标签: ruby http amazon-s3


【解决方案1】:

我都使用过 aws-sdk 和 right_aws。

这是执行此操作的代码。

require 'rubygems'
require 'aws-sdk'
require 'right_aws'
require 'net/http'
require 'uri'
require 'rack'


access_key_id     = 'AAAAAAAAAAAAAAAAA'
secret_access_key = 'ASDFASDFAS4646ASDFSAFASDFASDFSADF'


s3 = AWS::S3.new(  :access_key_id => access_key_id, :secret_access_key => secret_access_key)

right_s3 = RightAws::S3Interface.new(access_key_id,  secret_access_key,  {:multi_thread => true, :logger => nil} ) 



bucket_name = 'your-bucket-name'
key  = "your-file-name.ext"

right_url = right_s3.put_link(bucket_name, key)
right_scan_command = "curl -I --upload-file #{key} '#{right_url.to_s}'"
system(right_scan_command)

bucket = s3.buckets[bucket_name]
form = bucket.presigned_post(:key => key)
uri = URI(form.url.to_s + '/' + key)
uri.query = Rack::Utils.build_query(form.fields)
scan_command = "curl -I --upload-file #{key} '#{uri.to_s}'"
system(scan_command)

【讨论】:

    【解决方案2】:

    您能否提供有关“预签名 URL”如何工作的更多信息?是不是这样的:

    AWS::S3::S3Object.url_for(self.full_filename,
                              self.bucket_name, {
                                :use_ssl => true,
                                :expires_in => ttl_seconds
                              })
    

    我使用此代码向经过身份验证的客户端发送指向其 S3 文件的 URL。我相信这是您要询问的“预签名 URL”。我没有将此代码用于 PUT,所以我不确定它是否适合您,但它可能会让您接近。

    【讨论】:

      【解决方案3】:

      我知道这是一个较老的问题,但我想知道同样的事情,并在 AWS S3 Documentation 中找到了一个优雅的解决方案。

      require 'net/http'
      
      file = "somefile.ext"
      url = URI.parse(presigned_url)
      Net::HTTP.start(url.host) do |http|
         http.send_request("PUT", url.request_uri, File.read(file), {"content-type" => "",})
      end
      

      这对我的 Device Farm 上传非常有用。

      【讨论】:

        【解决方案4】:

        s3 library page 上的内容能满足您的需求吗?那里有很多例子。

        【讨论】:

        • 很遗憾没有。并且 RUBY S3 Gems 不支持签名的网址
        【解决方案5】:

        有一些用于 Ruby 的通用 REST 库;谷歌“红宝石休息客户端”。另见HTTParty

        【讨论】:

          【解决方案6】:

          我已经设法解决了。事实证明,Ruby 中的 HTTP:Net 有一些缺点。很多 Monkeypatch 后来我得到了它的工作.. 当我有时间的时候更多细节。谢谢

          【讨论】:

          • 然后提供解决方案。否则堆栈溢出不起作用。 :)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-04-23
          • 2020-09-30
          • 2016-06-17
          • 1970-01-01
          • 1970-01-01
          • 2020-10-23
          • 2018-12-27
          相关资源
          最近更新 更多