我曾经写过这个来在 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')