升级到 aws-sdk V2,现在预签名 URL 失败



我曾经写过这个来在 aws-sdk V1 中生成一个预签名 URL:

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'
)

它发送了一个选项/开机自检工作请求,如下所示:

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

我一行一行地看了一行,似乎其他一切都是相同的。有谁知道为什么这些失败了?或者是什么让他们与众不同?

以下是我进行预签名上传的过程。我马上注意到的一件事是你正在逃避钥匙中的/。我没有,它工作正常。我使用 ENV 变量来处理秘密内容。

config/initializers/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'])

在我的控制器中,我生成如下网址:

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

最新更新