可能这个问题听起来已经回答并且可以回复了,但我找不到答案。
我安装了一个WebApi作为支持SignalR的Windows服务。经过一些操作后,我尝试将* .zip文件推送到客户端:
using (var zip = new ZipFile())
{
zip.AddDirectory(mydir);
Clients.All.pushFile(zip,"application/zip, application/octet-stream",myname);
}
我有几个客户端:C#WinForms应用程序和带JavaScript的HTML页面。 我尝试使用FileSaver.js来处理这个方法,但似乎它不支持zip或者我做错了什么:
pushFile: function (result, type, name) {
try {
var blob = new Blob(result, type);
saveAs(blob, name);
} catch(e) {
alert(e);
}
}
所以问题 - 如何使用JavaScript客户端处理我的SignalR文件推送?我想有一个保存文件对话框。 如果这个问题已经得到解答,请分享链接并接受我的道歉!谢谢!
答案 0 :(得分:0)
这是一种解决方法,直到您找到filesaver.js无法正常工作的原因: 我相信你使用这个ZipFile:http://dotnetzip.herobo.com/DNZHelp/html/8b981f77-742a-5f47-6299-c27104871d8c.htm
在C#中:
//SignalR
string zipName = "myZip"
Clients.All.pushFileNotification("Download.aspx?myZip=" + zipName);
//Download.aspx
protected void Page_Load(object sender, EventArgs e)
{
if (!string.IsNullOrWhiteSpace(Request["myZip"]))
{
download(Request["myZip"]);
}
}
private void download(string myZip)
{
Response.Clear();
if (myZip == "myZip") // some validation if you want
{
using (MemoryStream output = new MemoryStream())
{
using (var zip = new ZipFile())
{
zip.AddDirectory(mydir);
if (Response.IsClientConnected)
{
Response.ClearHeaders();
Response.ClearContent();
zip.Save(output);
byte[] buffer = output.ToArray();
Response.AppendHeader("Content-Length", buffer.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.AppendHeader("Content-Disposition", "attachment; filename=" + myZip);
if (buffer.Length < 1)
{
return;
}
if (Response.IsClientConnected)
{
Response.BinaryWrite(buffer);
}
}
}
}
}
Response.End();
}
在html中添加iframe:
<iframe id="zipLoader" src="#" width="0" height="0" tabindex="-1" title="empty" hidden style="display: none;">
</iframe>
和js:
pushFileNotification: function (result) {
try {
$('#zipLoader').attr('src', result);
} catch(e) {
alert(e);
}
}
这很难看,但应该有效。最好的是它会像你写的一样工作。 我使用jQuery,但你可以理解这里发生了什么,你可以将它替换为普通的js。
答案 1 :(得分:0)
这可能没什么用,但希望它可以让你知道如何解决你的问题。
using (var zip = new ZipFile())
{
var mStream = new MemoryStream();
byte[] fileData = ;//get file data here
string fileName = ; // get file name here
var memoryStream = new MemoryStream(fileData);
memoryStream.Seek(0, SeekOrigin.Begin);
zip.AddEntry(fileName, memoryStream);
mStream.Seek(0, SeekOrigin.Begin);
zip.AddDirectory(mydir);
zip.Save(mStream);
mStream.Position = 0;
Clients.All.pushFile(mStream,"application/zip, application/octet-stream");
}