【问题标题】:File saving on HTML page using JavaScript使用 JavaScript 在 HTML 页面上保存文件
【发布时间】:2013-11-21 08:02:33
【问题描述】:

我正在尝试开发SignalRJavaScript 客户端(普通的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");

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

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

提前致谢!

更新 FireBug 调试器的屏幕截图

【问题讨论】:

  • 你可以尝试使用 type: 'application/octet-binary' 构建 blob
  • 抱歉没提这个,我已经试过了。
  • 也让我知道使用调试器的result.constructor的值
  • 请看我更新的问题。

标签: c# javascript html signalr


【解决方案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);
  }
}

【讨论】:

  • 它工作!但稍作修改:new Blob([u8], { type: 'application/octet-binary' })
  • 哦,是的。我错过了!恭喜!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 2015-04-11
  • 2021-01-10
  • 2015-07-04
  • 1970-01-01
相关资源
最近更新 更多