AngularJs如何从ASP.MVC5传递参数下载文件

问题描述 投票:0回答:2

我有一个ASP MVC5 API,它生成一个excel.xlsx并在FileContentResult中返回它。全部在内存中,因为我无法将文件保存到服务器磁盘。如果我直接访问网址,它可以正常工作。

我有一个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;
}

角度:

$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,因为我无法将文件保存到服务器磁盘。

任何的想法?

asp.net angularjs ajax download blob
2个回答
0
投票

将mime类型更改为“application / vnd.openxmlformats-officedocument.spreadsheetml.sheet”而不是“”application / vnd.ms-excel“


0
投票

经过多次搜索,我发现了一种方法,这个方法100%有效。我没有使用似乎有blob问题的AJAX,而是使用了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));
}
© www.soinside.com 2019 - 2024. All rights reserved.