简体   繁体   English

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

[英]File saving on HTML page using JavaScript

I'm trying to develop SignalR JavaScript client (plain HTML page, which gets live updates from my SignalR backend using JavaScript), and I'm struggling with file pushing problem. 我正在尝试开发SignalR JavaScript客户端(纯HTML页面,该页面使用JavaScript从我的SignalR后端获取实时更新),并且我在解决文件推送问题。

What I'm trying to achieve: Backend does some work and saves results to *.zip file on server, pushes this file to client, HTML page offers operator to save the file. 我要实现的目标:后端做了一些工作,并将结果保存到服务器上的* .zip文件中,将该文件推送到客户端, HTML页面为操作员提供了保存文件的方法。 Below there is a C# backend code doing zipping and push. 下面是执行压缩和推送的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");
                }
            }
        }

I've spent some time researching "saving files with JavaScript" and found a solution FileSaver.js , which allows to save generated files. 我花了一些时间研究“使用JavaScript保存文件”,并找到了一个解决方案FileSaver.js ,它可以保存生成的文件。 My JavaScript code: 我的JavaScript代码:

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

I've figured out, that I SignalR converts byte[] to base64 string , so I've made a little update to my C# : 我发现, SignalRbyte[]转换为base64 string ,所以我对C#进行了一些更新:

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

While debugging, I see, that received result parameter in JavaScript is an array, equal to byte[] array in C# , and zip file saving is issued, but unfortunately, it's invalid. 我看到在调试时,在JavaScript中接收到的result参数是一个数组,等于C# byte[]数组,并且已发布zip文件保存,但是不幸的是,它是无效的。 When I open it using Notepad++ , I see my array 8513115 ... 当我使用Notepad++打开它时,我看到了数组8513115 ...

Am I doing something wrong? 难道我做错了什么? Maybe there are other solutions to achieve my goal? 也许还有其他解决方案可以实现我的目标?

Thanks in advance! 提前致谢!

Update Screenshot from FireBug debugger 从FireBug调试器更新屏幕截图

FireBug调试器的屏幕截图

Try using Uinit8Array like: 尝试像这样使用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);
  }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM