Javascript 获取403访问拒绝仅在使用公共读取ACL时将文件上载到S3
我正在尝试发布图像数据(直接从浏览器使用JavaScript)。如果我使用Javascript 获取403访问拒绝仅在使用公共读取ACL时将文件上载到S3,javascript,amazon-s3,Javascript,Amazon S3,我正在尝试发布图像数据(直接从浏览器使用JavaScript)。如果我使用privateACL,一切正常,但如果我将其更改为public read我会得到403响应,消息是AccessDenied 我的策略中的acl属性与我要发送的acl表单参数匹配 我肯定已经过了身份验证阶段,就好像我故意搞砸了签名一样,我得到了signaturedesnotmatch响应 正如我所说,使用不同的ACL时,上传工作正常 你知道这是什么原因吗 根据要求,以下是我正在使用的代码(在我工作后需要进行一些整理):
private
ACL,一切正常,但如果我将其更改为public read
我会得到403响应,消息是AccessDenied
- 我的策略中的
属性与我要发送的acl
表单参数匹配acl
- 我肯定已经过了身份验证阶段,就好像我故意搞砸了签名一样,我得到了
响应signaturedesnotmatch
- 正如我所说,使用不同的ACL时,上传工作正常
.directive's3ImageUploader',['$http','$filter',($http,$filter)->
替换:正确
限制:“E”
范围:真
模板:“”
链接:($scope$element)->
awsAccessKeyId=“…”
秘密=“…”
bucket='…'
文件夹=“…”
政策=
有效期:“2020-12-01T12:00:00.000Z”
条件:[
{bucket:bucket}
['starts-with','$key','']
{acl:'公共读取'}
['starts-with'、'$Content-Type'、'image/']
]
policyBase64=$filter('base64')策略
签名=$filter('hmacSha1')policyBase64,secret
$element.on“更改”,->
file=$element.get(0).files[0]
key=“#{folder}/#{new Date().getTime()}-#{file.name}”
formData=新的formData()
formData.append'key',key
formData.append'acl','public read'
formData.append“内容类型”,file.Type
formData.append'AWSAccessKeyId',AWSAccessKeyId
formData.append“policy”,policyBase64
formData.append“签名”,签名
formData.append“file”,file
$http.post“https://{bucket}.s3.amazonaws.com/”,formData,
标题:
“内容类型”:“未定义”`
transformRequest:(数据)->数据
]
事实证明,我正在使用其凭据的用户需要设置一个策略,以使我能够使用公共读取您可以发布您的ACL吗?这是一个用CoffeeScript编写的角度指令(抱歉)附加到上面的问题。我已经用我自己的AWS帐户设置的新bucket测试了相同的代码,它运行良好,因此这与我尝试使用的bucket的配置有关。Rob,我认为你遇到的问题与我遇到的问题相同。您能详细解释一下该用户的凭据策略吗?提前谢谢。
.directive 's3ImageUploader', ['$http', '$filter', ($http, $filter) ->
replace: true
restrict: 'E'
scope: true
template: '<input type="file" name="image" class="form-control input-lg">'
link: ($scope, $element) ->
awsAccessKeyId = '...'
secret = '...'
bucket = '...'
folder = '...'
policy =
expiration: '2020-12-01T12:00:00.000Z'
conditions: [
{bucket: bucket}
['starts-with', '$key', '']
{acl: 'public-read'}
['starts-with', '$Content-Type', 'image/']
]
policyBase64 = $filter('base64') policy
signature = $filter('hmacSha1') policyBase64, secret
$element.on 'change', ->
file = $element.get(0).files[0]
key = "#{folder}/#{new Date().getTime()}-#{file.name}"
formData = new FormData()
formData.append 'key', key
formData.append 'acl', 'public-read'
formData.append 'Content-Type', file.type
formData.append 'AWSAccessKeyId', awsAccessKeyId
formData.append 'policy', policyBase64
formData.append 'signature', signature
formData.append 'file', file
$http.post "https://#{bucket}.s3.amazonaws.com/", formData,
headers:
'Content-Type': `undefined`
transformRequest: (data) -> data
]