从没有window.open的rest api下载文件

时间:2019-06-06 08:31:07

标签: java angular typescript rest

我正试图找到一种无需窗口即可从api下载文件的方法。 调用api时,我想立即下载。

当前正在使用window.open()下载由REST API生成的.xls文件

API端点

<dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.9</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.9</version>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.9</version>
        </dependency>

服务

@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;
    }

3 个答案:

答案 0 :(得分:0)

您可以将文件作为 blob 作为后端的响应返回,然后使用file-saver下载文件

enter code here`File "C:\Anaconda3\Scripts\scrapy-script.py", line 10, in <module>
sys.exit(execute())
File "C:\Anaconda3\lib\site-packages\scrapy\cmdline.py", line 110, in execute
settings = get_project_settings()
File "C:\Anaconda3\lib\site-packages\scrapy\utils\project.py", line 68, in get_project_settings
settings.setmodule(settings_module_path, priority='project')
File "C:\Anaconda3\lib\site-packages\scrapy\settings\__init__.py", line 295, in setmodule
self.set(key, getattr(module, key), priority)
File "C:\Anaconda3\lib\site-packages\scrapy\settings\__init__.py", line 270, in set
self.attributes[name].set(value, priority)
File "C:\Anaconda3\lib\site-packages\scrapy\settings\__init__.py", line 55, in set
value = BaseSettings(value, priority=priority)
File "C:\Anaconda3\lib\site-packages\scrapy\settings\__init__.py", line 91, in __init__
self.update(values, priority)
File "C:\Anaconda3\lib\site-packages\scrapy\settings\__init__.py", line 327, in update
for name, value in six.iteritems(values):
File "C:\Anaconda3\lib\site-packages\six.py", line 587, in iteritems
return iter(d.items(**kw))
AttributeError: 'list' object has no attribute 'items'

答案 1 :(得分:0)

我使用了这个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());
}

答案 2 :(得分:0)

快速解决方案:window.location.href = url;