Как сохранить бинарный файл на клиенте в jquery .post - PullRequest
2 голосов
/ 28 сентября 2011

У меня есть обработчик с этим кодом:

    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*/
    });

Я получаю двоичный файл слова в «data», но не могу сохранить его на клиенте.

последний раз, когда я использую:

window.location = handler;

но с jQuery.post это не работает.

Ответы [ 3 ]

2 голосов
/ 02 сентября 2014

ОТВЕТЫ НА ЭТОТ ВОПРОС НЕОБХОДИМО НЕМНОГО ОБНОВЛЕНИЯ, Я ДУМАЮ

Я столкнулся со следующей библиотекой: 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();
1 голос
/ 28 сентября 2011

Когда вы запрашиваете данные с помощью запроса AJAX, вам нужно обрабатывать их в JavaScript. Сохранение файла будет недоступно.

Вместо использования AJAX-запроса вам нужно создать form, который содержит ваши параметры. Направьте ответ в скрытый iframe, используя атрибут target, и браузер предложит сохранить файл.

0 голосов
/ 28 сентября 2011

Как уже упоминалось выше, существует ряд различных подходов.Возможно, вы захотите сначала посмотреть Загрузка файла jQuery .

Во-вторых, вам может понадобиться взглянуть на пару вариантов, включающих в решение flash ( uploadify или SWFUpload ).Я использовал оба в прошлом, и они удовлетворяли мои потребности удовлетворительно - но не идеально.

...