2013-05-21 64 views
3

我在view側有一個base64字符串。如果我通過整個base64陣列在一個時間,我可以在將其轉換成字節這樣如何解決這個基地64陣列問題

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) { 

    }); 
} 

而且在我寫代碼一樣控制器端:

byte[] myBinary = Convert.FromBase64String(datavalueincont); 
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); 
} 

但我在得到錯誤

並且誤差是

輸入不是有效的Base-64字符串,因爲它含有非底座64 字符,兩個以上的填充字符,或填充字符中非法字符 。

我該如何糾正這一點。如果我一次傳遞數據,我可以得到 myBinary數組中的字節。希望你能理解我的問題。

+5

「我得到的錯誤」 - 什麼樣的錯誤? – pascalhein

+0

@csharpler我已更新我的問題 – Pa1

+0

**我 Uzzy

回答

0

只有擁有完全加密的字符串時,才能使用byte[] myBinary = Convert.FromBase64String(datavalueincont);。 問題在於,您將Base64數據拆分爲塊,之後將這些塊發送到服務器 - >您試圖從每個單獨塊上的base64轉換回來的服務器上,而不是整個塊的集合。

我看到它的方式,你有兩個選擇:

  1. 加密數據的每個單獨分割塊爲base64(而不是前手整件事)和解密它在服務器上。 (將你的文件分割成幾部分) - >將它發送到服務器 - >緩存每個結果(任何你想要的 - >會話,db等)直到你得到的最後一個 - >解密在 一次

補充說明:

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

不知道是否錯字,只是說'。

+0

好吧,我們如何獲得完整的加密字符串 – Pa1

+0

不,我從整個大塊收集轉換。我將這些塊附加到全局定義的「字符串」中。當進入最後的if條件時,我將轉換整個塊。希望你明白 – Pa1

+1

分解之前轉換爲base64,然後將其轉換回並連接,或連接,然後從基地64轉換 –

0

我認爲你的概念是好的......從我的理解你正在做以下...

  1. 查看二進制數據轉換成Base64String
  2. 查看分割字符串成塊,併發送至控制器
  3. 控制器等待所有組塊和連接它們
  4. 控制器從Base64String

問題轉換是在你如何在視圖中分割你的數據......我假設分割代碼在最後可能有一些額外的填充字符?

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

我不能建立一個試驗檯,檢查代碼,但肯定對文本的最後一節中,你不能從.substr百萬字,因爲沒有字符串中的許多人物。我不知道.substr會返回什麼,但我會解決代碼的分割部分以查找問題。

+0

我在想像conc concatioion引入一些垃圾到字符串後,讀取OP的進一步的意見。另一種可能性是大塊以不同順序組裝。 –

+0

希望他會迴應並說出問題的結局。 – Kevin

0

您確定datavalueincont += content;是真正彙總您的所有數據。如何在每個http請求後存儲datavalueincont

也許你只是想念那個。

您是否調試過data == "last"以查看您的所有數據是否在datavalueincont

+0

耶我有所有的數據。我不確定它爲什麼這樣工作。這是我正在做的正確的程序 – Pa1

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

+1這是一個好記的點 – Kevin

+0

@polkduran謝謝你的奇妙想法。我解決了這個問題。而且我還將'filereader'更改爲'streamreader' – Pa1

+0

所以,你知道是什麼導致了錯誤嗎? – polkduran