Angular2 从 REST 下载 PDF API
Angular2 download PDF from REST API
我有一个 REST API,它必须 return 一个 PDF。我已将 PDF 转换为字节数组,并使用我的 REST 端点return它。
有效负载如下所示:
{"_body":"%PDF-1.4\n%����\n1 0 obj\n<<\n/Type /Catalog\n/Version /1.4\n/Pages 2 0 R\n>>\nendobj\n2 0 obj\n<<\n/Type /Pages\n/Kids [3 0 R]\n/Count 1\n>>\nendobj\n3 0 obj\n<<\n/Type /Page\n/MediaBox [0.0 0.0 612.0 792.0]\n/Parent 2 0 R\n/Contents 4 0 R\n/Resources 5 0 R\n>>\nendobj\n4 0 obj\n<<\n/Filter /FlateDecode\n/Length 51\n>>\nstream\r\nx�s\n��w3T04R\bI�245P0\u0007�\u0014.\r�Ԝ�|�\u0000\u00177��\nM��,.�\u0010.\u0000�\u001f\n�\r\nendstream\nendobj\n5 0 obj\n<<\n/Font 6 0 R\n>>\nendobj\n6 0 obj\n<<\n/F1 7 0 R\n>>\nendobj\n7 0 obj\n<<\n/Type /Font\n/Subtype /Type1\n/BaseFont /Courier-Bold\n/Encoding /WinAnsiEncoding\n>>\nendobj\nxref\n0 8\n0000000000 65535 f\r\n0000000015 00000 n\r\n0000000078 00000 n\r\n0000000135 00000 n\r\n0000000247 00000 n\r\n0000000371 00000 n\r\n0000000404 00000 n\r\n0000000435 00000 n\r\ntrailer\n<<\n/Root 1 0 R\n/ID [<A0C5C7406F668B945EA55D6F36833E8A> <A0C5C7406F668B945EA55D6F36833E8A>]\n/Size 8\n>>\nstartxref\n535\n%%EOF\n","status":200,"ok":true,"statusText":"OK","headers":{"Content-Type":["application/json;charset=UTF-8"]},"type":2,"url":"http://localhost:8090/api/forms/1/submissions/1/pdf"}
我已经在我的 Angular2 应用程序中导入了 FileSaver,但我找不到让它工作的方法。我需要 PDF 在收到时在客户端显示为下载文件。我怎样才能做到这一点?我是否应该更改我的 REST 端点 return 发送数据的方式?
您需要将数据流式传输回客户端 以便它能够下载而不是作为字节数组发送。由于Spring是基于servelet的,你可以这样做
.
.
.
protected void doGet(HttpServletRequest req, HttpServletResponse res) {
Path downloadFile = Paths.get("path/to/your/file");
res.setContentType("application/octet-stream");
res.setHeader("Content-Disposition", "attachment;filename="+ downloadFile.getFileName().toString());
OutputStream os = res.getOutputStream();
InputStream is = Files.newInputStream(downloadFile);
byte[] buffer = new byte[1024];
int read = -1;
while (((read = is.read(buffer)) != -1) {
os.write(buffer);
}
is.close();
os.close();
}
你可能想要错误处理,我为了简洁省略了
我有一个 REST API,它必须 return 一个 PDF。我已将 PDF 转换为字节数组,并使用我的 REST 端点return它。
有效负载如下所示:
{"_body":"%PDF-1.4\n%����\n1 0 obj\n<<\n/Type /Catalog\n/Version /1.4\n/Pages 2 0 R\n>>\nendobj\n2 0 obj\n<<\n/Type /Pages\n/Kids [3 0 R]\n/Count 1\n>>\nendobj\n3 0 obj\n<<\n/Type /Page\n/MediaBox [0.0 0.0 612.0 792.0]\n/Parent 2 0 R\n/Contents 4 0 R\n/Resources 5 0 R\n>>\nendobj\n4 0 obj\n<<\n/Filter /FlateDecode\n/Length 51\n>>\nstream\r\nx�s\n��w3T04R\bI�245P0\u0007�\u0014.\r�Ԝ�|�\u0000\u00177��\nM��,.�\u0010.\u0000�\u001f\n�\r\nendstream\nendobj\n5 0 obj\n<<\n/Font 6 0 R\n>>\nendobj\n6 0 obj\n<<\n/F1 7 0 R\n>>\nendobj\n7 0 obj\n<<\n/Type /Font\n/Subtype /Type1\n/BaseFont /Courier-Bold\n/Encoding /WinAnsiEncoding\n>>\nendobj\nxref\n0 8\n0000000000 65535 f\r\n0000000015 00000 n\r\n0000000078 00000 n\r\n0000000135 00000 n\r\n0000000247 00000 n\r\n0000000371 00000 n\r\n0000000404 00000 n\r\n0000000435 00000 n\r\ntrailer\n<<\n/Root 1 0 R\n/ID [<A0C5C7406F668B945EA55D6F36833E8A> <A0C5C7406F668B945EA55D6F36833E8A>]\n/Size 8\n>>\nstartxref\n535\n%%EOF\n","status":200,"ok":true,"statusText":"OK","headers":{"Content-Type":["application/json;charset=UTF-8"]},"type":2,"url":"http://localhost:8090/api/forms/1/submissions/1/pdf"}
我已经在我的 Angular2 应用程序中导入了 FileSaver,但我找不到让它工作的方法。我需要 PDF 在收到时在客户端显示为下载文件。我怎样才能做到这一点?我是否应该更改我的 REST 端点 return 发送数据的方式?
您需要将数据流式传输回客户端 以便它能够下载而不是作为字节数组发送。由于Spring是基于servelet的,你可以这样做
.
.
.
protected void doGet(HttpServletRequest req, HttpServletResponse res) {
Path downloadFile = Paths.get("path/to/your/file");
res.setContentType("application/octet-stream");
res.setHeader("Content-Disposition", "attachment;filename="+ downloadFile.getFileName().toString());
OutputStream os = res.getOutputStream();
InputStream is = Files.newInputStream(downloadFile);
byte[] buffer = new byte[1024];
int read = -1;
while (((read = is.read(buffer)) != -1) {
os.write(buffer);
}
is.close();
os.close();
}
你可能想要错误处理,我为了简洁省略了