升级到aws-sdk V2,现在预先签署的URL失败了

时间:2018-04-11 16:36:47

标签: ruby-on-rails ruby amazon-s3 aws-sdk pre-signed-url

我曾经写过这个来生成aws-sdk V1中的预签名网址:

AWS.config(S3Config::S3_CONFIG)
bucket = AWS.s3.buckets[S3Config::S3_CONFIG[:bucket]]
presigned_url = bucket.presigned_post(
  key: "attachments/#{SecureRandom.uuid}/${filename}",
  success_action_status: 201, acl: 'public-read'
)

发送了OPTIONS / POST 工作请求,如下所示:

https://gist.github.com/gotoAndBliss/cdd8818b8adce58d1b625f68e2633199

最大的区别是状态代码201 Created

然后我更新到V2并重写为:

presigned_url = Aws::S3::PresignedPost.new(aws_creds, aws_region, S3Config::BUCKET, {
  key: "attachments\/#{SecureRandom.uuid}\/\${filename}",
  metadata: {"original-filename" => "${filename}"},
  acl: 'public-read', success_action_status: ['201']
})

我非常确定写得好。但是这会产生这个请求:

https://gist.github.com/gotoAndBliss/43a4a88adc5c2be0b70b66d551a72a84

最大的区别是状态代码204 No Content

我通过这一行换行,似乎所有其他都是相同的。谁会知道为什么这些失败了?是什么让他们与众不同?

1 个答案:

答案 0 :(得分:1)

以下是我执行预先上传的过程。我立即注意到的一件事是你正在逃离钥匙中的/。我没有,它工作正常。我使用ENV变量来保密。

配置/初始化/ aws.rb:

Aws.config.update(
  {region: 'us-west-2',
   credentials: Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'],
   ENV['AWS_SECRET_ACCESS_KEY']),
  }
)

S3_BUCKET = Aws::S3::Resource.new.bucket(ENV['S3_BUCKET_NAME'])

在我的控制器中,我生成这样的URL:

@s3_direct_post = S3_BUCKET.presigned_post(
  key: "my_bucket_folder/#{SecureRandom.uuid}/${filename}", 
  success_action_status: '201', 
  acl: 'public-read')