我正在尝试开发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);
}
}
我已经发现,我SignalR
将byte[]
转换为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调试器的屏幕截图
答案 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);
}
}