我想将预签名的POST文件上传到AWS S3上的存储桶,该存储桶仅使用以下存储桶策略进行公共读取:
{
"Version": "2012-10-17",
"Id": "Policy1441191234567",
"Statement": [
{
"Sid": "Stmt1441195123456",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::mytestbucket/*"
}
]
}
预标识的URL会创建一个允许任何拥有它像描述做一个上传与HTTP POST这里。
我已经成功地使预签名的PUT可以在这里进行描述。即,我具有适当的凭据~/aws/credentials
,可以完全访问该存储桶。
在AWS Ruby SDK中,我发现该存储桶有一个PresignedPost,因此我尝试了以下操作:
require 'aws-sdk-resources'
require 'net/http'
require 'time'
require 'uri'
s3 = Aws::S3::Resource.new(region:'eu-central-1')
bucket = s3.bucket('mytestbucket')
post = bucket.presigned_post({
key: 'larry',
acl: "public-read",
expires: Time.now() + 30,
content_length_range: 1...1024,
success_action_redirect: "https://example.com/callback",
})
puts post.url
puts post.fields
uri = URI(post.url)
fields = post.fields.merge(file: "ken sent me")
res = Net::HTTP.post_form(uri, fields)
puts res.body
不幸的是,运行此命令将导致错误:
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>InvalidArgument</Code><Message>Conflicting query string parameters: acl, policy</Message><ArgumentName>ResourceType</ArgumentName><ArgumentValue>acl</ArgumentValue><RequestId>6132C47A14212345</RequestId><HostId>abcdKciFUKxvC4717Zm9w2ZB5lXJna+NSkxXzkb9123tjHZHb60JJa123KctSu862gY/j+a5+3w=</HostId></Error>
我尝试删除该acl
字段,但这会导致另一个错误:
<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>MethodNotAllowed</Code><Message>The specified method is not allowed against this resource.</Message><Method>POST</Method><ResourceType>BUCKETPOLICY</ResourceType><RequestId>9B3D7AAAE45BB47F</RequestId><HostId>yk823Z12345uucETlpQaG1234T0lxqjGAX4Uka123LQ6Pf22NVf45xxMmZAlFoQHaP+C4N60oLI=</HostId></Error>
URI是: https://mytestbucket.s3.eu-central-1.amazonaws.com
有什么问题,我该如何解决?
谢谢你的帮助!
更新
正如错误之一所言,该问题可能是acl和bucket策略冲突。我希望所有人都能阅读它,并且仅可以使用预先签名的URL进行上传(我假设所有者是创建URL的所有者)。这就是我认为已设置的方式。
因此,我用一个答案更新了Go问题, Ruby也是如此。我遇到的问题是正确生成多部分表单数据。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句