Angularjs ng文件上载到S3,v4 Auth-POST请求负载格式不正确

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&

更新:通过升级修复。从未检查过我们的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>
  <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--