Как разрешить загрузку файла, который возвращается в виде двоичных данных из AJAX - PullRequest
4 голосов
/ 17 ноября 2011

Моя проблема в том, что я отправляю клиенту первый PDF для загрузки, затем мне нужно проверить, существуют ли какие-либо данные в моей базе данных, а затем, в зависимости от этой проверки, мне нужно показать вопрос, что если пользователь хочет скачать другой PDF, тоЯ генерирую.

Мой код:

 //Here I just make dialog for question
 $('#printDWInfo').dialog({
            resizable: false,
            modal: true,
            autoOpen: false
        });

 //Here is my problem :)
 $('#generujWydruk').click(function (event) {
            event.preventDefault();
            $('#printForm').submit(); // <-- sending first request and client get first PFD file
            $.post('<%: ResolveUrl("~/Reports/KPiRReportDWCheck") %>', <-- check for another data
                $("#printForm").serialize(),
                function(data) {
                    if (data.length > 0) {
                        $("#printDWInfo").dialog( "option", "buttons", [
                            {
                                text: "Tak",
                                click: function () {
                                    $.ajax({ type: "POST",
                                        url: '<%= Url.Action("PrintDWList","Reports")%>',
                                        datatype: "json",
                                        traditional: true,
                                        data:{'ids': data },
                                        success: function (data2) {
                                            //I don't know what to do here
                                        }
                                    });
                                    $(this).dialog("close");
                                    }
                                }, {
                                text: "Nie",
                                click: function () {
                                    $(this).dialog("close");
                                    }
                            }
                        ]);
                        $('#printDWInfo').dialog("open");
                    }
                }
            );

Если клиент нажимает на кнопку «Tak» в диалоговом окне, я использую ajax-запрос, потому что могу передать массив контроллеров int, который возвращается $.post('<%: ResolveUrl("~/Reports/KPiRReportDWCheck") %>'.В случае успеха моего ajax-запроса FireBug показывает мне, что data2 - это двоичные данные моего PDF-файла, что мне нужно сделать, чтобы клиент мог загрузить этот PDF-файл?

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

В случае успешного выполнения моего запроса ajax FireBug покажет мне, что data2 - это двоичные данные моего PDF-файла, что мне нужно сделать, чтобы клиент мог загрузить этот PDF-файл?

Выне следует использовать AJAX для загрузки файлов.Проблема в том, что вы извлекаете pdf-байты из переменной javascript в обратном вызове успеха вашего AJAX-вызова, но вы ничего не можете с этим поделать.Вы не можете предложить пользователю сохранить его, и, конечно, вы не можете сохранить его на клиенте, поскольку у javascript нет необходимых привилегий.

Поэтому вы должны использовать обычный запрос:

var downloadUrl = '<%= Url.Action("PrintDWList", "Reports")%>?' + $.param({ ids: data }, true);
window.location.href = downloadUrl;

Обратите внимание, что это отправит запрос GET к действию PrintDWList, передав параметр строки запроса ids, поэтому убедитесь, что это действие доступно в GET.Теперь, если действие контроллера использует заголовок Content-Disposition для вложения, он предложит пользователю загрузить файл:

public ActionResult PrintDWList(int[] ids)
{
    byte[] pdf = ...
    return File(pdf, "application/pdf", "file.pdf");
}
0 голосов
/ 12 февраля 2015

@ Дарин всегда помогает на этом форуме. Его ответ спас мой день тоже. Просто расширяю свой ответ, чтобы включить форматы и прочее, что я и сделал. Это в ответ на его "Теперь, если действие контроллера использует заголовок Content-Disposition для вложения, он предложит пользователю загрузить файл:"

                case "PDF": 
                    HttpContext.Current.Response.AddHeader("Content-Type", "application/pdf");
                    HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + reportName + ".pdf");
                    break;

                case "XML": HttpContext.Current.Response.AddHeader("Content-Type", "application/xml");
                    break;

                case "MHTML": HttpContext.Current.Response.AddHeader("Content-Type", "message/rfc822");
                    HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + reportName + ".mhtml");
                    break;

                case "EXCEL": HttpContext.Current.Response.AddHeader("Content-Type", "application/vnd.ms-excel");
                    HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + reportName + ".xls");
                    break;

                case "WORD": HttpContext.Current.Response.AddHeader("Content-Type", "application/msword");
                    HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + reportName + ".doc");
                    break;

                case "CSV":
                    HttpContext.Current.Response.AddHeader("Content-Type", "text/csv");
                    HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + reportName + ".csv");
                    break;

                case "HTML4.0": HttpContext.Current.Response.AddHeader("Content-Type", "message/rfc822"); ;
                    break;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...