“我想下载一个从基于spring的restful web服务发送的.pdf文件到我的angular应用程序。如何下载,我的angular应用程序或Spring Boot上是不是缺少了一些代码?”
我正在从angular 6应用程序向spring-boot服务器发送一个HTTP GET请求,该服务器生成一个.pdf文件,然后将这个.pdf文件作为blob发送给我,但当我试图在angular侧创建一个blob并打开pdf时,它显示以下错误:
.ERROR ERROR:请求体既不是blob也不是数组缓冲区
我访问了以下关于StackOverflow的问题,以找到一些解决方法:1。PDF Blob未显示内容,角度%2%2。如何在不将其转换为字符串或JSON的情况下访问Angular 2 http响应体?3.将HTTPResponse正文中的字节流转换为pdf文件4。用SpringBoot将文件发送到Angular2
在Angular App:Component:
getPDF(){ this.apiService.getPDF(this.invoiceId) .subscribe( (data) => { //data.blob() doesnt work properly var file = new Blob([data.blob()], { type: 'application/pdf' }) var fileURL = URL.createObjectURL(file); window.open(fileURL); // if you want to open it in new tab var a = document.createElement('a'); a.href = fileURL; a.target = '_blank'; a.download = 'bill.pdf'; document.body.appendChild(a); a.click(); }, (error) => { console.log('getPDF error: ',error); } ); }
getPDF(invoiceId : number) { this.url = this.main_url + '/invoices/generatepdf/'+invoiceId; const headers = new Headers({ 'Content-Type': 'application/json', "Authorization": authorization, responseType : 'blob'}); return this.http.get(this.url, { headers : headers}) .pipe(map( (response) => { return response; }, (error) => { console.log(error.json()); } )); }在Spring靴:
控制器:
@RestController @RequestMapping("/invoices") public class InvoiceController { @Autowired InvoiceService invoiceService; @GetMapping(path = "/generatepdf/{invoiceId}") public void generateInvoicePdf(@PathVariable Integer invoiceId, HttpServletRequest request,HttpServletResponse response) { invoiceService.generateInvoicePdf(invoiceId, request, response); }@Override public String generateInvoicePdf(Integer invoiceId, HttpServletRequest request, HttpServletResponse response) { //createPDF() will create a .pdf file createPDF(pdfFilename, dto, dtoForSupplier); if (pdfFilename != null) { try { File file = new File(pdfFilename); FileInputStream is = new FileInputStream(file); response.setContentType("application/blob"); // Response header response.setHeader("Pragma", "public"); response.setHeader("responseType", "blob"); response.setHeader("Content-Disposition", "attachment; filename=\"" + pdfFilename + "\""); // Read from the file and write into the response OutputStream os = response.getOutputStream(); System.out.println(os); byte[] buffer = new byte[(int) file.length()]; int len; while ((len = is.read(buffer)) != -1) { os.write(buffer, 0, len); } System.out.println(os); os.flush(); os.close(); is.close(); } catch (IOException e) { e.printStackTrace(); } } return pdfFilename; }core.js:15724错误错误:请求正文既不是blob也不是数组缓冲区,位于response.push./node_modules/@angular/http/fesm5/http.js.body.blob(http.js:782)位于safeSubscriber._next(invoide-details.component.ts:212)位于safeSubscriber.push./node_modules/rxjs/_esm5/internal/subscriber.js.safeSubscriber.__tryRunsub(subscriber.js:196)位于One.js:423)>
按照@jbnizet的建议,我实现了如下可观察的:
组件:
getPDF(){
this.apiService.getPDF(this.invoiceId)
.subscribe(
(data: Blob) => {
var file = new Blob([data], { type: 'application/pdf' })
var fileURL = URL.createObjectURL(file);
// if you want to open PDF in new tab
window.open(fileURL);
var a = document.createElement('a');
a.href = fileURL;
a.target = '_blank';
a.download = 'bill.pdf';
document.body.appendChild(a);
a.click();
},
(error) => {
console.log('getPDF error: ',error);
}
);
}
服务:
getPDF(invoiceId : number): Observable<Blob>
{
this.url = this.main_url + '/invoices/generatepdf/'+invoiceId;
var authorization = 'Bearer '+sessionStorage.getItem("access_token");
const headers = new HttpHeaders({ 'Content-Type': 'application/json',
"Authorization": authorization, responseType : 'blob'});
return this.httpClient.get<Blob>(this.url, { headers : headers,responseType :
'blob' as 'json'});
}
我引用的URL:
问题内容: 鉴于这些问题 ,如果仍然存在,我深表歉意。这是该问题的另一个版本。 我的angular 1.5.X客户端为我提供了标题列表,每个标题都有一个关联的文件。我的Node 4.X / Express 4.X服务器使用该列表,获取文件位置,使用npm中的express-zip创建一个zip文件,然后将该文件流式传输回响应中。然后,我希望我的客户端启动浏览器的“下载文件”选项。 这是我的客户代码
在有人说“重复”之前,我只想确保大家知道,我已经回顾了这些问题: 1) 使用angular和php,不确定这里发生了什么(我不知道php):下载zip文件并从angular方法触发“保存文件”对话框 2) 什么都做不到:如何使用angular下载zip文件 3) 这个人已经可以下载了,这已经超过了我想弄明白的点:从一个按钮动作触发的角度下载外部zip文件 4) 这个问题没有答案:下载。nodejs
我正在运行一个tomcat服务器, 中,我导出如下所示。 < code > JAVA _ OPTS = " $ JAVA _ OPTS-JAVA agent:/opt/jaco co/lib/jaco agent . jar = dest file =/tmp/jaco co . exec,append=true,includes=*" 这将生成jacoco。文件夹中同一台计算机中的exec文件。
我正在尝试下载一个运行时生成的PDF文件(使用iTextPDF生成的PDF文件)在Springboot服务,并希望通过angular 6.0在新选项卡中打开该文件。我试着遵循这个,如何下载一个在我的服务器(springboot)上生成的angular的pdf文件?但错误为“无法加载PDF文档”。代码出了什么问题? Springboot服务:
问题内容: 使用该插件,我将创建一个文件并基于单击按钮生成下载。我想将文件保存到服务器上,而不是启动下载。因此,当单击按钮时,我希望将文件保存在: 我知道我需要使用将文件发布到服务器。但是,查看文档并没有看到对任何数据类型的支持。 我的代码: 基于此xml文档保存示例,我尝试了以下操作: 这将下载文件而不是保存文件。如何保存文件? 问题答案: 我设法使用来解决此问题,方法如下: upload.ph
我花了几个小时试图将文件上载到本地服务器文件夹,但比预期的困难,请帮助。 在我的前端下面插入文件 下面是我的控制器