【发布时间】: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);
}
}
我发现,我的SignalR 将byte[] 转换为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