首页 / 知识

使用ruby将文件http放置到S3预签名URL

2023-04-17 00:07:00

使用ruby将文件http放置到S3预签名URL

http PUT a file to S3 presigned URLs using ruby

任何人都有一个使用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的工作。谢谢


文件执行操作解决方案

最新内容

相关内容

猜你喜欢