我在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
数组。希望你理解我的问题。
答案 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转换回来而不是整个块的集合。
我看到它的方式,你有两个选择:
将每个单独拆分的数据块加密到base64(而不是整个事先),并在服务器上解密。
加密整个内容,然后将其拆分成碎片(就像你现在正在做的那样) - &gt;将其发送到服务器 - &gt;缓存每个结果(任何方式你 想要 - &gt;会话,数据库等)直到你得到最后一个 - &gt;解密 一旦
作为旁注:
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)
我认为你的概念很好......据我所知,你正在做以下事情......
问题在于如何在视图中拆分数据...我假设拆分代码在末尾有一些额外的填充字符?
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
是否包含所有数据?