2011-08-04 9 views
1

dojo.io.send.Howeverを使用して私のアマゾンアカウントにファイルをアップロードしようとしていますが、失敗しています。シーケンスを変更する

これは、火かき棒を通過したときに表示されるエラーです。

<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> 

私はその理由を考え出したと明らかに「キー」フィールドがあるため、それがものの下に無視して エラーを投げていることの 「ファイル」フィールドに以下の通りです。私は私の運を試してみました

key uploads/${filename} 
AWSAccessKeyId 
policy 
signature 
Content-Type plain/text 
file 

以下で遊んで - :この問題を修正するために

は、私は次のように のparamのリストを送信するためにdojo.io.send()を持っている必要がありますそれは常にファイル を先頭に置いています。

誰かがシーケンスを変更する際に私を助けることができたらうれしいです。

コードスニペット: -

おくる
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); 

     }, 

答えて

2

原因は道場だけでJSONオブジェクト内のすべてのプロパティを反復処理し、それからPOSTリクエストのボディを生成することです。反復の順序は不定であるため、常にkeyプロパティが最初のものであることを保証することはできません。

解決方法は、POST本体を自分で生成することです。 keyは常にポスト本体の最初の一つであり、これにより

"key=" + encodeURIComponent(key) + "&" + dojo.objectToQuery({AWSAccessKeyId : "", policy :""}) 

を:あなたが使ってPOST本体の文字列を取得することができます。

リクエストを送信するときは、contentプロパティを使用しないでください。代わりにrawBodyを使用してください。古いバージョンのDojoを使用している場合は、dojo.rawXhrPostを使用し、リクエストにpostDataプロパティを使用できます。

関連する問題