使用JavaScript下载推送文件

时间:2013-11-19 10:03:02

标签: c# javascript asp.net-web-api signalr

可能这个问题听起来已经回答并且可以回复了,但我找不到答案。

我安装了一个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文件推送?我想有一个保存文件对话框。 如果这个问题已经得到解答,请分享链接并接受我的道歉!谢谢!

2 个答案:

答案 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");
    }