从RestFul Java Spring后端下载Angular文件

时间:2018-03-14 07:34:34

标签: java spring angular rest download

我有一种情况,我想从我的RestFul java后端下载一个大文件。 java后端将以块的形式传输文件,请参阅以下代码:

    String filePath = this.workProgressService.getFilePath(entityId);
    Path path = Paths.get(filePath);
    FileNameMap fileNameMap = URLConnection.getFileNameMap();
    String mimeType = fileNameMap.getContentTypeFor(path.getFileName().toString());
    if (mimeType == null) {
        mimeType = "application/octet-stream";
    }
    response.setContentType(mimeType);
    response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", path.getFileName().toString()));
    FileCopyUtils.copy(Files.newInputStream(path), response.getOutputStream());

服务工作正常。 F.E.当我在浏览器中进入我的转发点http://localhost:8080/download弹出一个文件窗口时,我可以下载该文件。

但是当我使用以下代码从角度执行此操作时:

        const options = new RequestOptions({responseType: ResponseContentType.Blob});
        return this.authHttp.get(this.configurationService.getApiURL() +  '/filedownload', options)
        .map(response => {
            console.log(response.blob());
        });

完全下载文件后,将在结束时触发blob的控制台日志。如果我在Chrome的开发者控制台中观看请求,我可以看到它会先记录整个文件,然后再记录它的响应。这样就不会打开文件保存对话框,直到响应存在。

问题是我不能只使用href到Rest端点的位置,因为我需要在GET请求中发送授权头。

如何解决这个问题,用户可以直接从后端通过对话框下载文件,而不必等到浏览器完全下载文件?

1 个答案:

答案 0 :(得分:0)

问题解决了。 当整个get请求完成时,angular的GET请求将触发filesaver对话框。下载大文件时,这并不理想,因为它将被下载到浏览器内存中。

因为我必须使用通常位于标题中的授权令牌,所以我必须创建一个解决方法。

解决方法确实使用window.location.href与RESTful端点进行下载。但在转到此端点之前,会调用restful backend来创建一个有效下载文件的生存时令牌。 此标记将附加到location.href的URL。

现在浏览器处理文件对话框以将文件保存在计算机上。