如何在jquery .post中保存客户端上的二进制文件

时间:2011-09-28 17:08:15

标签: javascript jquery post httphandler

我有这个代码的处理程序:

    HttpRequest request = context.Request;
    HttpResponse response = context.Response;

    if (request["Type"] != null)
    {
        try
        {
            string resultFile = null;
            string fileName = string.Empty;

            int type = Convert.ToInt32(request["Type"]);

            switch (type)
            {
                case 1:
                    fileName = "InnerQuery.doc";
                    resultFile = GenerateInnerQuery(Id);
                    break;

                case 2:
                    fileName = "CourierQuery.doc";
                    resultFile = GenerateCourierQuery(Id);
                    break;

                case 3:
                    fileName = "TransportDogovor.doc";
                    resultFile = GenerateTransportDogovor(Id);
                    break;

                case 4:
                    fileName = "TransportQuery.doc";
                    resultFile = GenerateTransportQuery(Id);
                    break;

                case 5:
                    fileName = "PassQuery.doc";
                    resultFile = GeneratePassQuery(Id);
                    break;
            }

            if (resultFile != null)
            {
                response.Clear();
                response.AddHeader("pragma", "no-cache");
                response.AddHeader("cache-control", "private");
                response.CacheControl = "no-cache";
                response.ContentType = "application/octet-stream";
                response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}",
                    System.Web.HttpUtility.UrlPathEncode(fileName)));
                response.OutputStream.Write(File.ReadAllBytes(resultFile), 0, (int)(new FileInfo(resultFile)).Length);
                response.End();
            }
        }
        catch (Exception ex)
        { }
    }

在客户端上,我使用jQuery.post()发布数据到处理程序:

var handler = "GetWord.ashx?Type=6";
    var initiationDateFrom = $("#<%=InitiationDateFromTxt.ClientID%>").val();
    var initiationDateTill = $("#<%=InitiationDateTillTxt.ClientID%>").val();
    var queryDateFrom = $("#<%=QueryDateFromTxt.ClientID%>").val();
    var queryDateTill = $("#<%=QueryDateTillTxt.ClientID%>").val();
    var queryNumber = $("#<%=NumberTxt.ClientID%>").val();
    var initiator = $("#<%=InitiatorTxt.ClientID%>").val();
    var state = $("#<%=StateList.ClientID%>").val();
    $.post(handler,
    {
        InitiationDateFrom: initiationDateFrom,
        InitiationDateTill: initiationDateTill,
        QueryDateFrom: queryDateFrom,
        QueryDateTill: queryDateTill,
        QueryNumber: queryNumber,
        Initiator: initiator,
        State: state
    }, function (data) {
       /*here i should save my file*/
    });

我在“数据”中收到二进制文件,但无法将其保存在客户端。

上次我使用:

window.location = handler;

但是使用jQuery.post它不起作用。

3 个答案:

答案 0 :(得分:2)

这个问题的答案需要我更新的一点点

我遇到了以下图书馆:https://github.com/eligrey/FileSaver.js

同样在我的情况下,它就像下面这样简单:

至少这里的解决方案对我有用,我只需要在chrome(v37)中支持它。

<强>前言

我需要通过邮寄请求下载excel文件。所以这是我在阅读了几个规格和q&amp; as之后的解决方法。

在我的ajax调用设置中,我将响应类型设置为'blob':

'responseType': 'blob'

一旦收到成功的响应,你需要做一些小的DOM技巧来触发下载,如下所示:

var downloadLink = document.createElement('a');
downloadLink.download = 'export.xlsx';
downloadLink.innerHTML = 'Download File';
downloadLink.href = window.webkitURL.createObjectURL(data);
downloadLink.click();

答案 1 :(得分:1)

当您使用AJAX请求请求数据时,您需要在JavaScript中处理它。保存文件将无法使用。

您需要创建一个保存参数的form,而不是使用AJAX请求。使用iframe属性将响应指向隐藏的target,浏览器将提供保存文件。

答案 2 :(得分:-1)

如上所述,有许多不同的方法。您可能希望先查看jQuery File Upload

其次,您可能希望查看解决方案中包含闪存的几个选项(uploadifyswfupload)。我过去曾经使用过它们,但是他们满意地满足了我的需求 - 但并不完美。