2013-11-21 42 views
0

我正在嘗試開發SignalRJavaScript客戶端(使用JavaScript從我的SignalR後端獲取實時更新),並且我正在努力解決文件推送問題。使用JavaScript在HTML頁面上保存文件

我想要實現: 後端做了一些工作,並保存結果到服務器上的* .zip文件,推動該文件的客戶端,HTML頁面提供運營商保存文件。下面有一個C#後端代碼用於壓縮和壓縮。

private void CreateZip() 
     { 
      if (SdkHub.RR.XMLResults && SdkHub.RR.SaveImages) 
      { 
       using (var zip = new ZipFile()) 
       { 
        var mstream = new MemoryStream(); 
        mstream.Seek(0, SeekOrigin.Begin); 
        zip.AddDirectory(mydir); 
        zip.Save(mstream); 
        mstream.Position = 0; 
        Clients.All.downloadResult(mstream.ToArray(), myName+".zip"); 
       } 
      } 
     } 

我花了一些時間來研究「保存文件使用JavaScript」,並找到了解決辦法FileSaver.js,它允許保存生成的文件。我JavaScript代碼:

downloadResult: function (result, name) { 
      try { 
       var blob = new Blob(result, { type: "application/zip" }); 
       saveAs(blob, name); 
      } catch (e) { 
       alert(e); 
      } 
     } 

我已經想通了,我SignalR轉換byte[]base64 string,所以我做了一個小更新,我C#

var intArray = mstream.ToArray().Select(b => (int)b).ToArray(); 
Clients.All.downloadResult(intArray, myName+".zip"); 

調試時,我明白了,在JavaScript中收到的result參數是一個數組,等於byte[]數組在C#,併發出zip文件保存,但不幸的是,它是無效的。當我打開它使用Notepad++,我看到我的陣列8513115 ...

我做錯了什麼?也許有其他解決方案來實現我的目標?

提前致謝!

更新截圖來自FireBug調試

Screenshot from FireBug debugger

+0

你可以嘗試使用類型構建斑點: '應用程序/八位字節的二進制' – closure

+0

對不起不提這個,但我已經試過了。 –

+0

也讓我知道使用調試器result.constructor的價值 – closure

回答

1

嘗試使用Uinit8Array,如:

downloadResult: function (result, name) { 
    try { 
    var u8 = new Uint8Array(result.length); 
    for (var i=0; i < result.length; i++) u8[i] = result[i]; 

     var blob = new Blob(u8, { type: 'application/octet-binary' }); 
     saveAs(blob, name); 
    } catch (e) { 
     alert(e); 
    } 
} 
+0

它工作!但有一個小編輯:'新的Blob([u8],{type:'application/octet-binary'})' –

+0

哦,是的。我錯過了!恭喜! – closure

相關問題