当前位置: 首页 > 知识库问答 >
问题:

如何下载在我的服务器(springboot)上生成的angular pdf文件?

堵琨
2023-03-14

“我想下载一个从基于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)>

共有1个答案

夏景胜
2023-03-14

按照@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:

  1. 重载#2:https://angular.io/api/common/http/httpclient#get
  2. 使用Http post预览Blob:https://dzone.com/articles/how-to-preview-blobs-with-http-poster and-angular-5
 类似资料:
  • 问题内容: 鉴于这些问题 ,如果仍然存在,我深表歉意。这是该问题的另一个版本。 我的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

  • 我花了几个小时试图将文件上载到本地服务器文件夹,但比预期的困难,请帮助。 在我的前端下面插入文件 下面是我的控制器