Скачать файл из остальных API без window.open - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь найти способ загрузки файла из API без window.open (). Я хотел бы получить мгновенную загрузку при вызове API.

В настоящее время загружается файл .xls, сгенерированный API остальных, используя window.open ()

Конечная точка API

@GetMapping("/applications/export")
    @Timed
    public ResponseEntity<byte[]> exportApplicationsList() {
        log.debug("REST request to export applications list");

        byte[] result = applicationService.generateApplicationsListAsExcel();

        if (result == null) {
            return ResponseEntity.status(500).build();
        }

        String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("dd_MM_yyyy_HH_mm"));

        return ResponseEntity.ok()
            .header("Content-Disposition", "attachment; filename=liste_applications_" + date + ".xls")
            .contentLength(result.length)
            .contentType(MediaType.APPLICATION_OCTET_STREAM)
            .body(result);
    }

Услуги

/**
     * Generate xls file from applications list.
     *
     * @param applications list of applications
     */
    public byte[] generateApplicationsListAsExcel() {

        log.info("Génération fichier xls de la liste des applications");

        List<Application> applications = applicationRepository.findAll();
        Collections.sort(applications);

        try (InputStream is = new FileInputStream(ResourceUtils.getFile("classpath:jxls-templates/liste_applications_template.xls"))) {

            try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {
                Context context = new Context();
                context.putVar("applications", applications);
                JxlsHelper.getInstance().processTemplate(is, os, context);
                return os.toByteArray();
            } catch (IOException e) {
                log.error(e.toString());
            }

        } catch (IOException e) {
            log.error(e.toString());
        }

        return null;
    }

1011 * Воззвание *

exportApplicationsList(): void {
        window.open('/api/applications/export');
    }

Ответы [ 3 ]

0 голосов
/ 06 июня 2019

Я использовал file-saver , я думаю, он удовлетворит ваши потребности.

this.filesService.getDownloadFile(id).subscribe(
  data => {
    importedSaveAs(data, name);
  },
  err => {
    console.error(err);
  });

Для бэкэнда:

 @GetMapping("download-file/{id}")
public ResponseEntity<?> downloadFile(@PathVariable(value = "id") Long id) {

    final Optional<FileEntity> file = fileRepository.findById(id);
    if (!file.isPresent()) {
        return ResponseEntity.badRequest().body(getErrorResponse("File not found"));
    }

    ByteArrayOutputStream downloadInputStream = amazonClient.downloadFile(file.get().getLink());

    return ResponseEntity.ok()
            .contentType(contentType(file.get().getName()))
            .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.get().getName() + "\"")
            .body(downloadInputStream.toByteArray());
}
0 голосов
/ 06 июня 2019

Быстрое решение: window.location.href = url;

0 голосов
/ 06 июня 2019

Вы можете вернуть файл как blob как ответ от бэкэнда, а затем использовать file-saver для загрузки файла

this.http.get(`/api/applications/export`, params, { responseType: 'blob' })
  .subscribe((resp: any) => {
    saveAs(resp, `filename}.xlsx`)
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...