3

側面にbase64文字列がありますview。一度に配列全体を渡すと、次のbase64ようにバイトに変換できます

  byte[] myBinary = Convert.FromBase64String(data);

ここでdata、ビュー ページから来るデータを表します。しかし、私は膨大なデータを持っています。だから、ビューページのデータを次のように分割しています

var arr = [];  
for (var i = 0; i < data.length - 1; i += 1000000) {
   arr.push(data.substr(i, 1000000));
}

そして今、データをコントローラーに渡しています

for (var x = 0; x < arr.length; x++) {           
   if (x = 0) {
      r = "first";
   }
   else if (x = arr.length - 1) {
       r = "last";
   }
   else {
       r = "next";
   }
   $.post('/Home/Content', { content: e, data: r }, function (d) {

   });
}

コントローラー側では、次のようなコードを記述しました。

public JsonResult Content(string content, string data)
{
   datavalueincont += content;

   if (data == "last")
   {
       byte[] myBinary = Convert.FromBase64String(datavalueincont);
       var fname = "D://sri//data.mp4";
       FileStream stream = new FileStream(fname, FileMode.Create, FileAccess.Write);
       System.IO.BinaryWriter br = new System.IO.BinaryWriter(stream);
       br.Write(myBinary);
       br.Close();               
       read.Close();
       stream.Close();
   }

   return Json("suc", JsonRequestBehavior.AllowGet);
}

しかし、次の場所でエラーが発生しています:

byte[] myBinary = Convert.FromBase64String(datavalueincont);

そしてそのエラーは

入力は、base 64 以外の文字、3 つ以上の埋め込み文字、または埋め込み文字に無効な文字が含まれているため、有効な Base-64 文字列ではありません。

どうすればこれを修正できますか。一度にデータを渡すと、 myBinary配列内のバイトを取得できます。私の質問を理解していただければ幸いです。

4

4 に答える 4

1

考えがある。

Ajax を使用してデータを送信しているため、チャンクが順番に送信されるという保証はありません。

そのため、データを集計するときに、チャンクが適切な順序になっていない可能性があります。

この点を確認するために、Ajax 呼び出しを順番に実行してみてください。

[編集]

このようなもの(テストされていません):

var data = [];//your data

var sendMoreData = function (firstTime) {
    if (data.length == 0)
        return;//no more data to send

    var content = data.shift();
    var r = firstTime ? "first" :
            data.length == 0 ? "last":
            "next";

    $.post('/Home/Content', { content: content, data: r }, function (d) {
        sendMoreData();
    });
};

sendMoreData(true);
于 2013-05-21T16:33:47.827 に答える
0

datavalueincont += content;本当にすべてのデータを集約していると確信していますか。datavalueincont各 http リクエストの後にどのように保存しますか?

多分あなたはそれを見逃しているだけです。

data == "last"にすべてのデータがあるかどうかをいつ確認するかをデバッグしましたdatavalueincontか?

于 2013-05-21T16:24:04.700 に答える
0

byte[] myBinary = Convert.FromBase64String(datavalueincont);完全に暗号化された文字列を取得するまで使用できません。問題は、Base64データをチャンクに分割し、その後それらのチャンクをサーバーに送信することです->サーバー上で、チャンクのコレクション全体ではなく、個々のチャンクでbase64から変換しようとしています。

私の見方では、2 つのオプションがあります。

  1. 個別に分割されたデータのチャンクを (事前にすべてではなく) base64 に暗号化し、サーバー上で復号化します。

  2. 全体を暗号化し、それを断片に分割します(現在行っているように)->サーバーに送信します->各結果をキャッシュします(任意の方法->セッション、データベースなど)最後の結果を取得するまで- >一気に解読

補足として:

if (x = 0) {
   r = "first";
}
else if (x = arr.length - 1) {
   r = "last";
}

本当にあるべきです:

if (x == 0) {
   r = "first";
}
else if (x == arr.length - 1) {
   r = "last";
}

タイプミスかどうかわかりません。ただ言ってください。

于 2013-05-21T15:56:10.343 に答える