Обработка ресурса с помощью вызова ajax - PullRequest
0 голосов
/ 23 января 2019

Мое приложение предполагает загрузку файла из БД.

Контроллер:

@GetMapping(value = "/download/{id}")
public ResponseEntity<Resource> downloadBook(@PathVariable Long id) {

Book book = bookService.findById(id);

return ResponseEntity.ok().contentType(MediaType.APPLICATION_PDF)
        .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + book.getFileName() + ".pdf\"")
        .body(new ByteArrayResource(book.getFile()));

}

Это работает, когда я вызываю его прямо из браузера ( всплывающее окно загрузки ), но я пытаюсь сделать это с помощью вызова ajax. Пока это мой метод ajax, но этот код на самом деле просто предупреждает меня об успехе без всплывающего окна загрузки.

downloadBook : function(bookId) {
    $.ajax({
        url : basePath + '/book/download/' + bookId,
        success : function() {
            alert("success!");
        },
        error : function() {
            alert("error!");
        }
    });
}

Ответы [ 2 ]

0 голосов
/ 23 января 2019
downloadBook : function(bookId) {
    window.location = basePath + '/book/download/' + bookId
}

Мой метод downloadBook теперь выглядит следующим образом, и он решил мою проблему.

0 голосов
/ 23 января 2019

См. Загрузка файла от jQuery.Ajax

Здесь происходит то, что ваш ajax-запрос выполняется на /book/download/, как указано в параметре url:.Когда запрос завершается успешно, он запускает обратный вызов success.Тем не менее, все, что вы делаете - показывает предупреждение - alert("success!"), так что дальше ничего не произойдет.

Связанный ответ объясняет, почему вы не можете просто сделать это с помощью Ajax, как вы можете себе представить.Я не повторил весь связанный ответ, поскольку он уже был объяснен там, но принцип этого ответа точно такой же для вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...