Загрузка MVC FileResult не работает в браузерах IE или Edge - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь загрузить файл Excel, сгенерированный из данных, введенных через веб-страницу в приложении MVC.

Этот ajax-вызов выполняется при нажатии кнопки и вызывает два метода в моем контроллере. Один для создания файла Excel, а другой для загрузки файла:

$.ajax({
            type: 'POST',
            data: myDataObject,
            url: 'MyController/GenerateExcel/',
            success: function(data) {
                if (data.id != "") {
                    $http.get('MyController/DownloadExcel?id=' + encodeURIComponent(data.id) + '&name=' + encodeURIComponent(data.name));
                    return true;
                }
            }
        });

Вот мой метод POST, который генерирует файл Excel и сохраняет его в TempData:

[HttpPost]
    public JsonResult GenerateExcel(Object model)
    {
        var fileName = "myexcel.xlsx";
        var fileID = Guid.NewGuid().ToString();

        var generatedReport = GenerateCustomExcel(model);
        using (MemoryStream memoryStream = new MemoryStream())
        {
            generatedReport.SaveAs(memoryStream);
            generatedReport.Dispose();
            memoryStream.Position = 0;
            TempData[fileID] = memoryStream.ToArray();
        }


        return Json(new { id = fileID, name = fileName });
    }

Вот мой метод GET, который загружает сохраненный файл Excel из TempData:

[HttpGet]
    public FileResult DownloadExcel(string id, string name)
    {
        if (TempData[id] != null)
        {
            byte[] fileBytes = TempData[id] as byte[];
            return File(fileBytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", name);
        }
        else
        {
            return null;
        }
    }

Это работает безупречно в браузерах Google Chrome и Firefox. Однако при использовании браузеров Internet Explorer или Microsoft Edge файл не загружается.

Консоль отладки не выдает никаких полезных ошибок. Я попытался изменить возвращаемый тип файла на поток октетов и использовать window.location.href вместо запроса get для загрузки файла, но ничего не работает. Все функции вызываются и данные передаются между ними правильно, поэтому маршруты не являются проблемой.

Кто-нибудь знает, как я могу сделать возвращенную загрузку FileResult?

1 Ответ

0 голосов
/ 18 января 2019

Вот решение.Он использует тот же код, что и в моем вопросе, за исключением изменений, перечисленных здесь.

Добавьте элемент iframe на свою веб-страницу:

<iframe id="iFrameFileDownload" style="display: none;"></iframe>

В JavaScript вместо вызова с использованием $ http.get (), установите атрибут 'src' элемента iframe в URL-адрес функции контроллера:

$.ajax({
        type: 'POST',
        data: myDataObject,
        url: 'MyController/GenerateExcel/',
        success: function(data) {
            if (data.id != "") {
                $("#iFrameFileDownload").attr("src", 'MyController/DownloadExcel?id=' + encodeURIComponent(data.id) + '&name=' + encodeURIComponent(data.name));
                return true;
            }
        }
    });

Другое решение, которое я рассмотрел, - использовать функцию window.open () вместо $ http.get().(источник: Загрузить файл с помощью mvc ) Однако это решение использует всплывающие окна и потребует от пользователей включить всплывающие окна в своем браузере перед загрузкой файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...