3

我在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数组中的字节。希望你能理解我的问题。

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 转换回的服务器上。

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

  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 回答
0

我认为您的概念很好...据我了解,您正在执行以下操作...

  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 会返回什么,但我会对代码的拆分部分进行故障排除以找到问题。

于 2013-05-21T16:14:41.853 回答