如何修复这个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
数组。希望你能理解我的问题。
我有个主意。
当您使用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转换回来的服务器上。
在我看来,你有两个选择:
-
将每个单独分割的数据块加密为base64(而不是事先全部加密),并在服务器上解密。
-
加密整个内容,然后将其分成几部分(就像您现在所做的那样)->将其发送到服务器->缓存每个结果(任何方式都可以)想要-> 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";
}
不确定是不是打错了,只是说。
我认为你的概念很好…据我所知,你正在做以下事情……
- View将二进制数据转换为Base64String
- 视图将字符串分割成块并发送给控制器
- 控制器等待所有块并连接它们
- 控制器转换自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
中拥有所有数据?