15

我正在尝试在我的 Rails 服务器上生成一个预签名的 url 以发送到浏览器,以便浏览器可以上传到 S3。

似乎aws-sdk-s3是未来使用的宝石。但不幸的是,我没有遇到可以提供清晰说明的 gem 文档。似乎有几种不同的方法可以这样做,并且希望对以下方法的差异提供任何指导 -

  1. 使用Aws::S3::Presigner.newhttps://github.com/aws/aws-sdk-ruby/blob/master/aws-sdk-core/lib/aws-sdk-core/s3/presigner.rb)但似乎不需要在对象参数或身份验证凭据中。

  2. 使用Aws::S3::Resource.new,但似乎aws-sdk-resources不会被维护。(https://aws.amazon.com/blogs/developer/upgrading-from-version-2-to-version-3-of-the-aws-sdk-for-ruby-2/

  3. 使用Aws::S3::Object.new然后调用该put对象上的方法。

  4. 直接使用AWS::SigV4

我想知道它们有何不同,以及选择一个而不是另一个的含义?任何建议都非常感谢,尤其是aws-sdk-s3.

谢谢!

4

2 回答 2

16

所以,多亏了上面@strognjz 的提示,这就是我使用“aws-sdk-s3”的方法。

require 'aws-sdk-s3'

#credentials below for the IAM user I am using
s3 = Aws::S3::Client.new(
  region:               'us-west-2', #or any other region
  access_key_id:        AWS_ACCESS_KEY_ID,
  secret_access_key:    AWS_SECRET_ACCESS_KEY
)

signer = Aws::S3::Presigner.new(client: s3)
url = signer.presigned_url(
  :put_object,
  bucket: S3_BUCKET_NAME,
  key: "${filename}-#{SecureRandom.uuid}"
)
于 2017-06-25T20:12:14.527 回答
14

这将使用 aws-sdk-s3 gem

aws_client = Aws::S3::Client.new(
  region:               'us-west-2', #or any other region
  access_key_id:        AWS_ACCESS_KEY_ID,
  secret_access_key:    AWS_SECRET_ACCESS_KEY
)


s3 = Aws::S3::Resource.new(client: aws_client)
bucket = s3.bucket('bucket-name')
obj = bucket.object("${filename}-#{SecureRandom.uuid}")

url = obj.presigned_url(:put)

额外的http动词:

obj.presigned_url(:put)                              
obj.presigned_url(:head)                    
obj.presigned_url(:delete)
于 2017-08-01T22:13:51.230 回答