使用JavaScript在HTML页面上保存文件

时间:2013-11-21 08:02:34

标签: c# javascript html signalr

我正在尝试开发SignalR JavaScript客户端(普通HTML页面,它使用JavaScript从我的SignalR后端获取实时更新),我正在努力解决文件推送问题。

我想要实现的目标: 后端执行一些工作并将结果保存到服务器上的* .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);
            }
        }

我已经发现,我SignalRbyte[]转换为base64 string,因此我对C#进行了一些更新:

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

调试时,我看到,result中收到的JavaScript参数是一个数组,等于byte[]中的C#数组,并且发出了zip文件保存,但是不幸的是,这是无效的。当我使用Notepad++打开它时,我会看到我的数组8513115 ...

我做错了吗?也许有其他解决方案来实现我的目标?

提前致谢!

更新 FireBug调试器的屏幕截图

Screenshot from FireBug debugger

1 个答案:

答案 0 :(得分:1)

尝试使用Uint8Array,如:

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