gpt4 book ai didi

ruby-on-rails - 使用移动客户端的查询参数获取 S3 预签名帖子 url

转载 作者:行者123 更新时间:2023-12-03 19:15:52 26 4
gpt4 key购买 nike

我正在使用 Rails 4 为后端服务创建 API。
该服务需要将图像文件上传到亚马逊 s3 存储桶。

我想使用直接上传 url,以便客户端管理上传到 s3 并且服务器不会保持忙碌。

目前我有以下典型的 rails 操作

def create
filename = params[:filename]
s3_direct_post = S3_BUCKET.presigned_post(key: "offers/#{SecureRandom.uuid}/#{filename}", acl: 'public-read')
s3p = s3_direct_post.fields
url = "#{s3_direct_post.url}/#{filename}?X-Amz-Algorithm=#{s3p['x-amz-algorithm']}&X-Amz-Credential=#{s3p['x-amz-credential']}&X-Amz-Date=#{s3p['x-amz-date']}&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=#{s3p['x-amz-signature']}"
render json: {success: true, url: url}, status: :ok
end

这会生成这样一个网址:
https://my-bucket.s3.eu-central-1.amazonaws.com/test.png?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=MYKEY/20150420/eu-central-1/s3/aws4_request&X-Amz-Date=20150420T162603Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Signature=MYSIGNATURE

现在我尝试使用以下内容将 test.png 发布到此 url:
curl -v -T test.png "url"
我收到以下错误响应:
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>MYKEY</AWSAccessKeyId>...

我相信问题来自这样一个事实,即指定的 X-Amz-SignedHeaders header 是错误的。我不确定 amazon rails sdk gem 中默认使用哪些 header 。

我应该如何更改我的 url 生成,以便移动客户端可以只获取 url 并将文件发布到它?

最佳答案

这是一个解决方案:

config/initializers/aws.rb :

AWS_CREDS = Aws::Credentials.new(ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'])

Aws.config.update({
region: 'eu-central-1',
credentials: AWS_CREDS
})

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

在您的模型/ Controller /关注点/或其他任何内容中:
obj = S3_BUCKET.object("offers/#{user.id}/#{self.id}")
url = obj.presigned_url(:put) # obj.presigned_url(:put, acl: 'public-read') #if you want to make the file public

然后上传您可以使用移动客户端或 curl:
curl -X PUT -T file_to_upload "url from above"

请注意,您必须添加 x-amz-acl: public-read标题,如果您使用 public-read acl 选项:
curl -H "x-amz-acl: public-read" -X PUT -T file_to_upload "url from above"

关于ruby-on-rails - 使用移动客户端的查询参数获取 S3 预签名帖子 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29753666/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com