>

excel.xlsx를 생성하고 FileContentResult에 반환하는 ASP MVC5 API가 있습니다. 파일을 서버 디스크에 저장할 수 없으므로 메모리에 모두 있습니다. URL에 직접 액세스하면 정상적으로 작동합니다.

거대한 Json을 API에 전달하고 생성 된 .xlsx 파일을 받아야하는 AngularJS 애플리케이션이 있습니다.

다음을 시도하고 있습니다 :

컨트롤러 :

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을 생성하고 반환 할 방법이 없습니다.

아무 생각 없나요?


  • 답변 # 1

    마임 유형을 ""application/vnd.ms-excel "대신"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet "로 변경

  • 답변 # 2

    많은 검색 끝에 방법을 찾았습니다. 하나는 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));
    }
    
    

관련 자료

  • 이전 r - 참조 파일을 사용하여 주 도시 이름 수정
  • 다음 c# - 자식 메뉴가있는 Xamarin Forms 탭 페이지