通过ng-file-upload上传到Amazon S3;错误400

时间:2015-07-12 10:53:35

标签: python angularjs amazon-web-services file-upload amazon-s3

我正在使用ng-file-upload将照片上传到S3。我已经使用ng-file-upload demo tool测试了我的S3存储桶和我的策略/签名生成器,并已成功使用它将照片上传到我的存储桶。

编辑:关键区别似乎是添加标题:

Authorization:Token 3j4fl8jk0lqfkj4izj2w3ljfopljlwep1010notreal

这存在于我的代码中但不在演示页面中。也许这是我的角色应用程序。

通过凉亭安装,拿走相关组件,尝试上传文件,并收到如下错误:

 400: <?xml version="1.0" encoding="UTF-8"?> 
 <Error>
 <Code>InvalidArgument</Code> 
 <Message>Unsupported Authorization Type</Message> 
 <ArgumentName>Authorization</ArgumentName>
 <ArgumentValue>Token 3j4fl8jk0lqfkj4izj2w3ljfopljlwep1010notreal</ArgumentValue>
 <RequestId>F1F5FK-not-real-81FED9CA</RequestId>
 <HostId>CQEW98p3D2e+pVz-not-real-codeu28m7asqpGjagL3409gj3f4kijKJpofk</HostId>
 </Error>

搜索时,我已经注意到400个错误,但ArgumentValueToken [some-code-here]的情况并不多。

查看AWS documentationInvalidArgument对于AWS的新手来说有点不透明。

以下是我编码的政策(Python):

#exptime = '2100-07-31T06:23:35Z' #for debugging
policy_document = {"expiration": exptime,
    "conditions": [ 
      {"bucket": settings.AWS_STORAGE_BUCKET_NAME}, 
      ["starts-with", '$key', ""],
      {"acl": "private"},
      ["starts-with", "$Content-Type", ""],
      ["starts-with", "$filename", ""],
      ["content-length-range", 0, 5000000] 
    ]
  }

重申一下,这个带有上述演示的策略有效,所以我预计我的前端实现会出现问题:

$scope.upload = function(file) {
    file.upload = Upload.upload({
                url: 'https://mybucket.s3-us-west-2.amazonaws.com',
                method: 'POST',
                fields: {
                    key: file.name,
                    AWSAccessKeyId: myAccessKeyId,
                    acl: 'private',
                    policy: myPolicyEncoded,
                    signature: mySignatureEncoded,
                    "Content-Type": file.type === null || 
                        file.type === '' ? 'application/octet-stream' : file.type,
                    filename: file.name
                },
                file: file
            });
}

2 个答案:

答案 0 :(得分:2)

我花了一段时间才找到它,但正如我的编辑所指出的那样,查看请求标头时,Angular应用程序的登录/身份验证过程中使用的令牌是默认发送的,而Amazon&#39;服务并不是那样的。删除此特定案例的http请求中的标题解决了该问题。

我前端的上传服务如下所示:

$scope.upload = function(file) {
    file.upload = Upload.upload({
                url: 'https://mybucket.s3-us-west-2.amazonaws.com',
                method: 'POST',
                fields: {
                    key: file.name,
                    AWSAccessKeyId: myAccessKeyId,
                    acl: 'private',
                    policy: myPolicyEncoded,
                    signature: mySignatureEncoded,
                    "Content-Type": file.type === null || 
                        file.type === '' ? 'application/octet-stream' : file.type,
                    filename: file.name
                },
                headers: {
                    'Authorization': undefined
                },
                file: file
            });
}

答案 1 :(得分:0)

这是一个旧线程,但我刚遇到此错误。

除了删除自定义标头外,您还可以将该标头放入CORS政策中,例如:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>POST</AllowedMethod>
    <AllowedMethod>PUT</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
</CORSConfiguration>