创建 Amazon S3 预签名 url 用于 public 从 Ruby 访问 Rails
Creating Amazon S3 presigned url for public access from Ruby on Rails
我遇到了与 完全相同的问题,但是当我在 Postman 中测试时,我的代码生成了以下错误:
AccessDenied 请求中存在 header 个未签名的请求。
这是创建 url:
的 ruby 代码
require 'aws-sdk'
class Api::AmazonController < ApiController
before_action :set_credentials
def presign
if params[:filename] # && params[:type]
s3 = Aws::S3::Resource.new(region:'eu-west-2')
bucket = Rails.application.secrets.s3_bucket_name.to_s
obj = s3.bucket(bucket).object(params[:filename])
url = obj.presigned_url(:put, acl:'public-read') #, content_type: params[:type], expires: 10*60)
render json: url
else
render json: { error: 'Invalid params' }
end
end
private
def set_credentials
Aws.config[:credentials] = Aws::Credentials.new(Rails.application.secrets.aws_access_key_id, Rails.application.secrets.aws_secret_access_key)
# Aws.config.update({region: 'eu-west-2'})
end
end
如果我从 ruby 代码中删除 x-amz-acl
header:
url = obj.presigned_url(:put)
然后就可以了,我可以放一个文件了。那我错过了什么?
解决方案是不在 Postman 中添加 header。将其保留在 ruby 代码中并从 Postman 中删除 'x-amz-acl' 参数解决了问题。
我遇到了与
AccessDenied 请求中存在 header 个未签名的请求。
这是创建 url:
的 ruby 代码require 'aws-sdk'
class Api::AmazonController < ApiController
before_action :set_credentials
def presign
if params[:filename] # && params[:type]
s3 = Aws::S3::Resource.new(region:'eu-west-2')
bucket = Rails.application.secrets.s3_bucket_name.to_s
obj = s3.bucket(bucket).object(params[:filename])
url = obj.presigned_url(:put, acl:'public-read') #, content_type: params[:type], expires: 10*60)
render json: url
else
render json: { error: 'Invalid params' }
end
end
private
def set_credentials
Aws.config[:credentials] = Aws::Credentials.new(Rails.application.secrets.aws_access_key_id, Rails.application.secrets.aws_secret_access_key)
# Aws.config.update({region: 'eu-west-2'})
end
end
如果我从 ruby 代码中删除 x-amz-acl
header:
url = obj.presigned_url(:put)
然后就可以了,我可以放一个文件了。那我错过了什么?
解决方案是不在 Postman 中添加 header。将其保留在 ruby 代码中并从 Postman 中删除 'x-amz-acl' 参数解决了问题。