我正在尝试使用dojo.io.send将文件上传到我的亚马逊帐户。但是,它没有这样做。
这是我在通过萤火虫时看到的错误。
<Error>
<Code>InvalidArgument</Code>
<Message>Bucket POST must contain a field named 'key'. If it is specified,
please check the order of the fields.</Message>
<ArgumentValue></ArgumentValue>
<ArgumentName>key</ArgumentName>
我找出了原因,显然“关键”字段位于下方 “文件”字段,因为它忽略了下面的那些并抛出了 错误。
为了纠正这个问题,我需要让dojo.io.send()发送 param的列表如下: -
key uploads/${filename}
AWSAccessKeyId
policy
signature
Content-Type plain/text
file
我通过使用以下代码尝试了我的运气,但它始终放置文件 在顶部的字段。
如果有人能帮助我改变顺序,我将不胜感激。
代码段: -
var jsonpArgs =
{
url: "https://s3.amazonaws.com/<Bucketname>",
form : dojo.byId("Myform"),
//MyForm has an attribute
//as file which takes the file name from the user to upload.
handleAs: "json",
content:
{
"key":"*******",
"AWSAccessKeyId":"****",
"policy" :"***********",
"signature":"*******",
"Content-Type":"plain/text"
},
error: function(error)
{
},
};
dojo.io.iframe.send(jsonpArgs);
},
理解的,
答案 0 :(得分:2)
原因是Dojo只是迭代JSON对象中的所有属性并从中生成POST请求主体。由于迭代的顺序未确定,因此您无法保证key
属性始终是第一个。
解决方案是自己生成POST主体。您可以使用以下命令获取POST正文字符串:
"key=" + encodeURIComponent(key) + "&" + dojo.objectToQuery({AWSAccessKeyId : "", policy :""})
通过这样做,key
始终是帖子正文中的第一个。
发送请求时,请勿使用content
属性,而是使用rawBody
。如果您使用的是旧版本的Dojo,也许您可以在请求中使用dojo.rawXhrPost
并使用postData
属性。