Angularjs ng文件上载到S3,v4 Auth-POST请求负载格式不正确
更新:通过升级修复。从未检查过我们的bower.json,它是用v5.0.9(现在是12.0.4)运行的!吃鞋子 我正在尝试使用v4身份验证/签名AngularJS 1.4.1将“简单”图像上载到S3。v4似乎工作正常,但当AWS响应告诉我没有发送正确的请求负载时,我不确定如何对剩余部分进行故障排除:Angularjs ng文件上载到S3,v4 Auth-POST请求负载格式不正确,angularjs,amazon-s3,ng-file-upload,Angularjs,Amazon S3,Ng File Upload,更新:通过升级修复。从未检查过我们的bower.json,它是用v5.0.9(现在是12.0.4)运行的!吃鞋子 我正在尝试使用v4身份验证/签名AngularJS 1.4.1将“简单”图像上载到S3。v4似乎工作正常,但当AWS响应告诉我没有发送正确的请求负载时,我不确定如何对剩余部分进行故障排除: <?xml version="1.0" encoding="UTF-8"?> <Error> <Code>InvalidArgument</Code&
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>InvalidArgument</Code>
<Message>POST requires exactly one file upload per request.</Message>
<ArgumentName>file</ArgumentName>
<ArgumentValue>0</ArgumentValue>
<RequestId>B353DC15D1CC165F</RequestId>
<HostId>8joOZ1eyGCW88X3t6ppL7DSKM8XPIu0MrJ7A/dozNG0Cg205cEH5NeEV1lsvKWw+ama8Xqx1w+s=</HostId>
</Error>
在browser network(浏览器网络)窗口中,请求有效负载仅显示单个部分,其中Upload config(上传配置)对象以纯文本形式存在。这应该是多个部分,上传对象中的每个属性一个
在Chrome中选择文件后,它将使用
<img ngf-src="orgCtrl.logoFileArray[0]">
Javascript如下所示:
view.uploadLogo = function() {
// (snip) get server-side signature/policy secrets etc
var uploadObj = {
url: "https://xyzpdq-test-images.s3.amazonaws.com/",
method: "POST",
data: {
"key" : "logos/TEST.png",
"acl" : res.s3PolicyResult.acl,
"policy" : res.s3PolicyResult.base64Policy,
"X-amz-credential" : res.s3PolicyResult.credentials,
"X-amz-algorithm" : res.s3PolicyResult.algorithm,
"X-amz-date" : res.s3PolicyResult.date,
"X-amz-signature" : res.s3PolicyResult.signature,
"Content-Type" : 'image/png',
"success_action_status": res.s3PolicyResult.successStatus,
"file" : view.logoFileArray[0] // ??? no file data?
}
};
$log.debug('uploadObj', uploadObj);
Upload.upload(uploadObj)
.then(function (resp) {
console.log('Success ' + resp.config.data.file.name + 'uploaded. Response: ' + resp.data);
}, function (resp) {
console.log('Error status: ' + resp.status);
}, function (evt) {
var progressPercentage = parseInt(100.0 * evt.loaded / evt.total);
console.log('progress: ' + progressPercentage + '% ' + evt.config.data.file.name);
});
};
更新:根据注释,我也尝试删除内容类型
元素,但没有效果:我仍然看到相同的JSON对象负载,而不是带有边界标记的多个部分
目标是使请求看起来像这样(假签名/策略数据,但格式正确):
我需要实际的表单HTML元素吗?(尝试只使用ngf select
attrib)按钮就可以获得上述内容,但这是使用s3v2auth。停止调试ng文件上传
插件,但可能会出现这种情况
更新2:
var upload = Upload.upload({
url: "https://xyzpdq-test-images.s3.amazonaws.com/",
method: 'POST',
data: {
key : "logos/TEST.png",
acl : res.s3PolicyResult.acl,
policy : res.s3PolicyResult.base64Policy,
'X-amz-credential': res.s3PolicyResult.credentials,
'X-amz-algorithm' : res.s3PolicyResult.algorithm,
'X-amz-signature' : res.s3PolicyResult.signature,
'Content-Type' : logoFile.type !== '' ? logoFile.type : 'application/octet-stream',
filename : "TEST.png",
file : logoFile
}
});
再次尝试使用该有效负载,但请求有效负载仍然没有使用数据
对象的每个元素作为单独的部分进行格式化,我只看到一个部分,其中包含数据的字符串表示形式
:
------WebKitFormBoundary6CDiwAgytdoviD7R
Content-Disposition: form-data; name="data"
{"key":"logos/TEST.png","acl":"public-read","policy":"eyJleHBpcmF0aW9uIjoiMjAzMC0xMi0zMVQxMjowMDowMC4wMDBaIiwiY29uZGl0aW9ucyI6W3siYWNsIjoicHVibGljLXJlYWQifSx7ImJ1Y2tldCI6ImhhdmVuLWRldi1pbWFnZXMifSxbInN0YXJ0cy13aXRoIiwiJGtleSIsImxvZ29zLyJdXX0=","X-amz-credential":"AKIAJAXCR6PRBXGHLU4Q/20160401/us-west-1/s3/aws4_request","X-amz-algorithm":"AWS4-HMAC-SHA256","X-amz-signature":"674d747f7e83375a1742c1a42cfd08799ffed7223aa9a255f4ea5eaad0df4470","Content-Type":"image/png","filename":"TEST.png","file":{}}
------WebKitFormBoundary6CDiwAgytdoviD7R--
问题的本质是显而易见的:您将整个“表单”发布为json对象,因此生成的请求主体。我的JavaScript不够流利,无法告诉您如何修复它,但看到文档化的示例可能会让您朝着正确的方向前进。请删除内容类型或使用Upload.http()@danial谢谢,但当我删除内容类型时,仍然会出现相同的400错误,并且负载不会被发送到多部分/表单数据,这只是表格数据。如果我使用Upload.http(),同样的事情——“Bucket POST必须是封装类型multipart/formdata”。格式总是JSON对象。说明:请求负载不是多部分的,它只是
数据:{}
对象作为文本作为唯一部分。什么会阻止请求形成具有边界的多部分?内容处置应该是表单数据。在文档上试试这个例子:`key:file.name,“Content-Type”:file.Type!=''?file.type:'application/octet stream',//文件的内容类型(NotEmpty)filename:file.name,file:file`
------WebKitFormBoundary6CDiwAgytdoviD7R
Content-Disposition: form-data; name="data"
{"key":"logos/TEST.png","acl":"public-read","policy":"eyJleHBpcmF0aW9uIjoiMjAzMC0xMi0zMVQxMjowMDowMC4wMDBaIiwiY29uZGl0aW9ucyI6W3siYWNsIjoicHVibGljLXJlYWQifSx7ImJ1Y2tldCI6ImhhdmVuLWRldi1pbWFnZXMifSxbInN0YXJ0cy13aXRoIiwiJGtleSIsImxvZ29zLyJdXX0=","X-amz-credential":"AKIAJAXCR6PRBXGHLU4Q/20160401/us-west-1/s3/aws4_request","X-amz-algorithm":"AWS4-HMAC-SHA256","X-amz-signature":"674d747f7e83375a1742c1a42cfd08799ffed7223aa9a255f4ea5eaad0df4470","Content-Type":"image/png","filename":"TEST.png","file":{}}
------WebKitFormBoundary6CDiwAgytdoviD7R--