我有一个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,因为我无法将文件保存到服务器磁盘。
任何的想法?
将mime类型更改为“application / vnd.openxmlformats-officedocument.spreadsheetml.sheet”而不是“”application / vnd.ms-excel“
经过多次搜索,我发现了一种方法,这个方法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));
}