代码之家  ›  专栏  ›  技术社区  ›  macarthy

http使用ruby将文件放入S3预先指定的url

  •  2
  • macarthy  · 技术社区  · 16 年前

    6 回复  |  直到 13 年前
        1
  •  2
  •   CantGetANick    12 年前

    我使用了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
  •  1
  •   Dan Harper    16 年前

    你能提供更多关于“预签名URL”如何工作的信息吗?是这样的吗:

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

    我使用这段代码将经过身份验证的客户机的URL发送到他们的S3文件。我相信这是你要问的“预签名URL”。我还没用过这个代码,所以我不确定它是否适合你,但它可能会让你接近。

        3
  •  1
  •   J. Lovell    6 年前

    我知道这是个老问题,但我也在想同样的问题,在 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
    

    这对我的设备场上传非常有效。

        4
  •  0
  •   Dan Harper    16 年前

    在上面做什么 s3 library page 满足你的需要?那里有很多例子。

        5
  •  0
  •   Your Common Sense    16 年前

    Ruby有一些通用的REST库;Google有“Ruby REST client”。另见 HTTParty .

        6
  •  -5
  •   macarthy    16 年前

    我已经设法解决了。原来Ruby中的HTTP:Net有些不足。很多Monkeypatch后来我开始工作了。。等我有时间再详细说。感谢