4

javascript クライアントから Mvc サーバーに大きな base64 文字列 (数メガバイト) を送信したいと考えています。現在、Ajax を使用して、次のような文字列を送信しています。

Upload = function (aUrl, aFormData, aOnProgress, aOnSuccess, aOnTimeout, aOnError) {
   var settings = {
      url: aUrl,
      type: "POST",
      contentType: "application/json; charset=utf-8",
      data: JSON.stringify(aFormData), // { aData: longBase64String }
      success: function (resultObject, textStatus) {
         if (textStatus == "success" && aOnSuccess) aOnSuccess(resultObject);
      },
      error: function (jqXHR, textStatus, errorThrown) {
         if (textStatus == "timeout" && aOnTimeout) aOnTimeout();
         else if (textStatus == "error" && aOnError) aOnError();
      }
   };

   settings.xhr = function () {
      var req = new XMLHttpRequest(); // Create xml http request.
      if (req) req.addEventListener('progress', aOnProgress, false); // Upload progress.
      return req;
   }

   return $.ajax(settings);
}

aFormData は、単純に base64 文字列を含む Json オブジェクトを取得しています: { aData: myString }.

Mvc 側には、コントローラー用の次のコードがあります。

[Authorize, RequireHttp, HttpPost]
public ActionResult SetImage(String aData) {
   // Do something with the data.
   return Json("We got it.");
} 

現在、サーバーにデータを取得する限り、これはローカルホストのテスト環境で機能しているようです。私は、これが非同期でバッファリングされた素敵な方法で「ストリーミング」されていない可能性があることを懸念していますが、送信されるまですべてをブロックする可能性があり、localhost を実行しているため、クライアントに「実際の」影響が見られません。私はここで何が起こっているかについて十分に知りません。

すべてがブロックされることなく、クライアントが Web アプリケーションを引き続き使用できるようにしたいと考えています。コンテンツ タイプを変更する必要がありますか、それとも Mvc 側のパラメーターを変更する必要がありますか? これがまとまって送信されることを願っています。

私のアプローチが正しいとしても、誰かがここで舞台裏で何が起こっているかについて少し教えてもらえますか? 「マルチパート」を含むコンテンツ タイプを使用する投稿を見たことがありますか? それは何ですか、ここで使用する必要がありますか?

ありがとう。

4

1 に答える 1

0

リクエストが jQuery を使用して非同期で送信される限り (デフォルト設定)、クライアントをブロックすることはありません。

「マルチパート」の質問に関しては、フォーム コンテンツ タイプ「マルチパート/フォーム データ」を参照している可能性が最も高いです。

ファイル、非 ASCII データ、およびバイナリ データを含むフォームを送信するには、コンテンツ タイプ「multipart/form-data」を使用する必要があります。

ソース: http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4

ファイル、「非ASCIIデータ」、またはバイナリではないbase64コンテンツを送信しているので、問題ありません。

于 2012-07-18T20:26:37.660 に答える