Как скачать файл из ответа AJAX - PullRequest
1 голос
/ 08 апреля 2020

Я делаю AJAX POST-запрос к контроллеру пружины и получаю возвращенный байтовый массив в качестве ответа. Я хочу сделать его скачиваемым. Каков наилучший подход?

Вот моя реализация:

var params = [[${params}]];
$("#download-button").click(function(e) {
e.preventDefault();
$.ajax({
    type: "POST",
    contentType: "application/json",
    url: "/patient-listing/excel",
    data: JSON.stringify(params),
    success: function(result) {

        var byteArray = result;
        var a = window.document.createElement('a');
        a.href = window.URL.createObjectURL(new Blob([byteArray], { type:'application/octet-stream' }));

        a.download = "file.XLSX";
        document.body.appendChild(a)
        a.click();
        document.body.removeChild(a)

    },
    error: function(result) {
        console.log('error');
    }
  });
});

Здесь, хотя файл загружен, данных нет.

Контроллер:

@PostMapping(value = "/patient-listing/excel", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity getEmployeeReportXlsx(@RequestBody Param param) {

    logger.info("Generating Excel report of param : " + param);
    final byte[] data = poiService.getExcelFile(param);
    HttpHeaders header = new HttpHeaders();
    header.setContentType(MediaType.parseMediaType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"));
    header.set(HttpHeaders.CONTENT_DISPOSITION, "inline; filename=case-data-report.xlsx");
    header.setContentLength(data.length);
    return new ResponseEntity<>(data, header, HttpStatus.OK);
}

1 Ответ

0 голосов
/ 08 апреля 2020

Вы можете просто скачать Excel без запроса AJAX, изменить метод POST на метод GET, используя @ GetMapping

@GetMapping(value = "/patient-listing/excel", consumes = MediaType.APPLICATION_JSON_VALUE)

в тимелии,

<a class="sidebar-element" th:href="@{/patient-listing/excel}">
     Generate Excel
</a>
...