如何修复此Base 64阵列问题

时间:2013-05-21 15:44:49

标签: c# asp.net-mvc c#-4.0

我在view方面有一个base64字符串。如果我一次传递整个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字符串,因为它包含非基数64   字符,两个以上的填充字符或非法字符   在填充字符中。

我该如何纠正这个问题。如果我一次传递数据,我就可以得到数据 myBinary数组。希望你理解我的问题。

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

在拥有完全加密的字符串之前,您无法使用byte[] myBinary = Convert.FromBase64String(datavalueincont);。 问题是您将Base64数据拆分为块,然后将这些块发送到服务器 - &gt;在服务器上,你试图从每个块上的base64转换回来而不是整个块的集合。

我看到它的方式,你有两个选择:

  1. 将每个单独拆分的数据块加密到base64(而不是整个事先),并在服务器上解密。

  2. 加密整个内容,然后将其拆分成碎片(就像你现在正在做的那样) - &gt;将其发送到服务器 - &gt;缓存每个结果(任何方式你 想要 - &gt;会话,数据库等)直到你得到最后一个 - &gt;解密 一旦

  3. 作为旁注:

    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";
    }
    

    不确定是否错字,只是说'。

答案 2 :(得分:0)

我认为你的概念很好......据我所知,你正在做以下事情......

  1. 查看将二​​进制数据转换为Base64String
  2. 视图将字符串拆分为块并发送到控制器
  3. Controller等待所有块并将它们连接起来
  4. 控制器从Base64String转换
  5. 问题在于如何在视图中拆分数据...我假设拆分代码在末尾有一些额外的填充字符?

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

    我无法构建一个测试工具来检查代码,但肯定在你的最后一段文本中,你无法从.substr获得1000000个字符,因为字符串中没有那么多字符。我不知道.substr会返回什么,但我会解决代码的拆分部分以找到问题。

答案 3 :(得分:0)

您确定datavalueincont += content;真正汇总了您的所有数据吗?如何在每次http请求后存储datavalueincont

也许你只是错过了那个。

您是否在data == "last"时调试了datavalueincont是否包含所有数据?