首页 > 解决方案 > Angular 不会从流( StreamingResponseBody )中下载文件

问题描述

我正在使用 Angular 下载大文件,对于我使用 Spring Boot 的后端,这是端点的代码:

@RequestMapping(value = "/download", method = RequestMethod.GET)
public StreamingResponseBody download(@PathVariable String path) throws IOException {

    final InputStream file =azureDataLakeStoreService.readFile(path);
    return (os) -> {
        readAndWrite(file , os);
    };
}

private void readAndWrite(final InputStream is, OutputStream os)
        throws IOException {
    byte[] data = new byte[2048];
    int read = 0;
    while ((read = is.read(data)) >= 0) {
        System.out.println("appending to file");
        os.write(data, 0, read);
    }
    os.flush();
}

当我尝试使用 curl 获取文件时,它可以工作,并且我可以看到正在下载的文件并且它的大小正在增加:

curl -H "Authorization: Bearer <MyToken>" http://localhost:9001/rest/api/analyses/download --output test.zip

但是,当我尝试使用 Angular 下载文件时它不起作用,即使请求成功,我可以在日志中看到文本“附加到文件”多次显示,但浏览器上没有下载任何内容,这是我的代码:

this.http.get(url, { headers: headers, responseType: 'blob', observe: 'response' })
    .subscribe(response => {
        const contentDispositionHeader: string = response.headers.get('Content-Disposition');
        const parts: string[] = contentDispositionHeader.split(';');
        const filename = parts[1].split('=')[1];
        const blob = new Blob([response.body], {
            type: 'application/zip'
        });
        saveAs(blob, filename);
    });

saveAs() 属于file-saver,顺便说一句,当我尝试将文件下载为 byte[] (没有流式传输)时,上面的代码有效。

我在互联网上只能找到这段代码,它在使用 angular 5 时使用 angularJs,任何人都可以指出问题所在!谢谢。

更新

我可以看到文件正在谷歌浏览器的网络选项卡中下载,但我不知道文件保存在哪里。

在此处输入图像描述

标签: angulardownloadinputstreamoutputstream

解决方案


我尝试使用您的后端代码,但在角度我使用了这个:

window.location.href = "http://localhost:9001/rest/api/analyses/download";

它开始成功下载。


推荐阅读