Как AngularJs загружает файл из ASP.MVC5 с передачей параметров - PullRequest
0 голосов
/ 27 марта 2019

У меня есть ASP MVC5 API, который создает файл excel.xlsx и возвращает его в FileContentResult.Все в памяти, так как не могу сохранить файл на диске сервера.Это работает нормально, если я обращаюсь к URL напрямую.

У меня есть приложение AngularJS, которому нужно передать огромный Json в API и получить сгенерированный файл .xlsx.

Я пытаюсьследующее:

Контроллер:

public async Task<FileContentResult> Excel([FromBody]GetGeneralFilterVM operationHistoryFilter = null)
{
    var ListaOperazioni = await GetListaOperazioniData(operationHistoryFilter);
    var Totals = await GetExcelTotalsData(operationHistoryFilter);

    var excelExport = new ExcelExportEntity(new object[]
        {
            ListaOperazioni,
            Totals,
        });
    var preFile = excelExport.DoExcel();
    var arraybits = preFile;
    var file = File(arraybits, "application/vnd.ms-excel", "OperationHistory.xlsx");

    return file;
}

Angular:

$scope.exportExcel = () => {
$.ajax({
    cache: false,
    url: appPath + "controller/Excel",
    data: filter, 
    success: function (response) {
        var file = new Blob([response], { type: "application/vnd.ms-excel" });
            var fileName = "excelFeliz.xlsx";
            saveAs(file, fileName);
        },
        error: function (ajaxContext) {
            alert('Export error: ' + ajaxContext.responseText);
        }
    });
}

Это даже загрузит файл, но при попытке открыть его будет поврежден.

Я настаиваю на AJAX из-за GetGeneralFilterVM, который я получаю в контроллере, он содержит вложенные объекты со многими свойствами, было бы очень сложно поместить это как параметры в URL.

У меня также нет никакого способасоздать и вернуть URL для загрузки, потому что я не могу сохранить файл на диск сервера.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

После долгих поисков я нашел способ, этот работает на 100%.Вместо того, чтобы использовать AJAX, который, кажется, имеет проблемы с BLOB-объектами, я использовал вызов XMLHttpRequest.Примечание: контроллер не был изменен.

getExportExcel: function (filter) {

    var json_upload = "operationHistoryFilter=" + JSON.stringify(filter);
    var url = appPath + "OperationHistoryReport/ExcelGeneral";
    var fileName = "excel.xlsx"
    var request = new XMLHttpRequest();
    request.open('POST', url, true);
    request.setRequestHeader('Content-Type', 'application/json');
    request.responseType = 'blob';

    request.onload = function (e) {
        if (this.status === 200) {
            var blob = this.response;
            if (window.navigator.msSaveOrOpenBlob) {
                window.navigator.msSaveBlob(blob, fileName);
            }
            else {
                var downloadLink = window.document.createElement('a');
                var contentTypeHeader = request.getResponseHeader("Content-Type");
                downloadLink.href = window.URL.createObjectURL(new Blob([blob], { type: contentTypeHeader }));
                downloadLink.download = fileName;
                document.body.appendChild(downloadLink);
                downloadLink.click();
                document.body.removeChild(downloadLink);
            }
        }
    };
    request.send(JSON.stringify(filter));
}
0 голосов
/ 27 марта 2019

Измените тип MIME на «application / vnd.openxmlformats-officedocument.spreadsheetml.sheet» вместо «« application / vnd.ms-excel »

...