从Java后端

时间:2018-05-25 18:25:36

标签: javascript java spring angular angular5

我无法弄清楚如何使用Angular从API下载文件。我从后端发送一个Blob,但我不认为我以正确的方式转换它,因为它给我一个序列化错误。然而,bytearray确实给了我它的内容,但不是下载。

这是我的Java代码:

@GetMapping("{id}")
public byte[] getExambyId(@PathVariable int id) {
    Exam exam = new Exam();
    byte[] file;
    try {
        exam = examRepository.findById(id).get();
        file = IOUtils.toByteArray(new FileInputStream(storageService.load(exam.getSkelet()).toFile()));
    } catch (NoSuchElementException e) {
        log.error("Exam with id: " + id + " not found.", this.getClass());
        return null;
    } catch (StorageFileNotFoundException e) {
        log.error("Cannot find examfile: " + exam.getSkelet() + ".", this.getClass());
        return null;
    } catch (FileNotFoundException e) {
        log.error("Cannot find file with filestream: " + exam.getSkelet() + ".", this.getClass());
        return null;
    } catch (IOException e) {
        log.error("IoException on: " + exam.getSkelet() + ".", this.getClass());
        return null;
    }
    return file;
}

这是我在前端的服务:

getExamSkeletById(id) {
  window.open(APIURL + '/' + id);
}

1 个答案:

答案 0 :(得分:1)

我不使用Java,所以我无法评论来自服务器的数据是否正确。但在我的Angular项目中,我使用npm下的“文件保护程序”库来触发保存从我的服务器发送的PDF。然后在我的Angular代码中产生一些效果:

import * as FileSaver from 'file-saver';

downloadPDF() {
    this.http.get("api/endpoint/address", {withCredentials: true, responseType: "blob"}).subscribe(r => {
      var blob = r;
      FileSaver.saveAs(blob, "Filename.pdf");
    });
}

this.http引用在组件的构造函数中注入的HttpClient。