任何人都有一个使用ruby在s3上发布到预签名URL的有效示例
我同时使用了aws-sdk和right_aws。
这是执行此操作的代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| 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) |
我知道这是一个较旧的问题,但是我想知道同一件事,并在AWS S3文档中找到了一个优雅的解决方案。
1 2 3 4 5 6 7
| 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上传非常有效。
能否提供有关"预签名URL"如何工作的更多信息?是这样的:
1 2 3 4 5
| AWS::S3::S3Object.url_for(self.full_filename,
self.bucket_name, {
:use_ssl => true,
:expires_in => ttl_seconds
}) |
我使用此代码将经过身份验证的客户端的URL发送到其S3文件。我相信这是您要询问的"预签名URL"。我尚未将此代码用于PUT,因此我不确定是否适合您,但可能会使您接近。
有一些针对Ruby的通用REST库; Google为"ruby休息客户"。另请参见HTTParty。
s3库页面上的内容是否满足您的需求?那里有很多例子。
我已经设法解决了。事实证明,Ruby中的HTTP:Net有一些不足之处。后来我做了很多Monkeypatch的工作。谢谢