我曾经写过这个来生成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
我通过这一行换行,似乎所有其他都是相同的。谁会知道为什么这些失败了?是什么让他们与众不同?
答案 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')