如何修复这个Base 64数组问题

本文关键字:数组 问题 Base 何修复 | 更新日期: 2023-09-27 18:14:33

我在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字符串,因为它包含一个非base 64字符、两个以上填充字符或非法字符

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

如何修复这个Base 64数组问题

我有个主意。

当您使用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);

在完全加密字符串之前不能使用byte[] myBinary = Convert.FromBase64String(datavalueincont);。问题是,您将Base64数据分割成块,然后将这些块发送到服务器->在您试图从每个单独的块而不是整个块集合上从Base64转换回来的服务器上。

在我看来,你有两个选择:

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

  2. 加密整个内容,然后将其分成几部分(就像您现在所做的那样)->将其发送到服务器->缓存每个结果(任何方式都可以)想要-> session, db等)直到你得到最后一个-> decrypt at一旦

作为旁注:

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

不确定是不是打错了,只是说。

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

  1. View将二进制数据转换为Base64String
  2. 视图将字符串分割成块并发送给控制器
  3. 控制器等待所有块并连接它们
  4. 控制器转换自Base64String

问题在于你如何在视图中分割数据…我假设分割代码有一些额外的填充字符结束也许?

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

我不能建立一个测试平台来检查代码,但可以肯定的是,在你的最后一节文本中,你不能从。substr中获得1000000个字符,因为字符串中没有那么多字符。我不知道。substr将返回什么,但我会对代码的分割部分进行故障排除以找到问题。

您确定datavalueincont += content;真的在聚合您的所有数据吗?如何在每个http请求后存储datavalueincont ?

也许你只是错过了这一点。

您是否调试过data == "last"时查看是否在datavalueincont中拥有所有数据?