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

标签 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 是行不通的。

最佳答案

我认为这个问题的答案需要一些更新

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

在我的案例中,它也很简单,如下所示:

至少这是适合我的解决方案,我只需要在 chrome (v37) 中支持它。

前言:

我需要通过邮寄请求下载 excel 文件。因此,在阅读了一些规范和问答后,我是如何解决这个问题的。

在我的 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();

关于javascript - 如何在 jquery .post 中将二进制文件保存在客户端上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7586923/

相关文章:

javascript - Angular 元素记录不正确的值

javascript - 如何判断何时应用 @font-face 规则

jquery - 在 jQuery 中重叠多个 setTimeouts

php - 如何使用 multipart/form-data 编码发布数组?

asp.net-mvc - 将 Textarea 发布到 Controller (当前正在传递 null)-MVC

javascript - 减少大数组JS中对象中的数组

jquery - 如何从 WordPress 前端删除 jquery?

javascript - 使用 jquery 的日期选择器,以月份和年份作为网格

java - 我在哪里向 SOLR 提交 XML

javascript - 监听子集合的变化