简体   繁体   English

Angular 2:PDF文件下载

[英]Angular 2: PDF file download

I am trying to download a PDF file using Java-Angular 2. I've tested my Java code with Postman and it works very well but when I receive the data in the client side I get this: 我正在尝试使用Java-Angular 2下载PDF文件。我已经使用Postman测试了我的Java代码并且它运行良好但是当我在客户端收到数据时,我得到了这个:

收到的数据

and if I use FileSaver , I get an empty file. 如果我使用FileSaver ,我会得到一个空文件。

This is the Java controller code: 这是Java控制器代码:

    @RequestMapping(value = { "/gestionnaire/documents/file/{id}" }, method = RequestMethod.GET, 
        produces = {"image/jpeg","image/png", "application/json" , "text/plain" , "application/pdf"})
public ResponseEntity<InputStreamResource> getFile(HttpServletRequest request , @PathVariable Long id) throws JSONException, IOException {
      Document document = documentService.findById(id);
      File file = new File(document.getChemin());
      String fileName = file.getAbsolutePath().substring(file.getAbsolutePath().lastIndexOf("\\")+1);
      InputStream input = new FileInputStream(file);
      HttpHeaders headers = new HttpHeaders();
      String extension = fileName.substring(fileName.lastIndexOf(".")+1);
      switch (extension) {
      case "pdf":  headers.setContentType(MediaType.parseMediaType("application/pdf "));
               break;
      case "txt":  headers.setContentType(MediaType.parseMediaType("text/plain "));
               break;
      case "png":  headers.setContentType(MediaType.parseMediaType("image/png "));
               break;
      case "jpeg":  headers.setContentType(MediaType.parseMediaType("image/jpeg "));
               break;

      default: headers.setContentType(MediaType.parseMediaType(""));
               break;
  }
      headers.add("Access-Control-Allow-Origin", "*");
      headers.add("Access-Control-Allow-Methods", "GET, POST, PUT");
      headers.add("Access-Control-Allow-Headers", "Content-Type");
      headers.add("Content-Disposition", 
      "attachment;filename=\""+URLEncoder.encode(fileName, "UTF-8") + "\" 
       ");
      headers.add("Cache-Control", "no-cache, no-store, must-revalidate");
      headers.add("Pragma", "no-cache");
      headers.add("Expires", "0");
      headers.setContentLength(file.length());
      ResponseEntity<InputStreamResource> response = new 
      ResponseEntity<InputStreamResource>(
      new InputStreamResource(input), headers, HttpStatus.OK);
      return response;
}

and this is the component method: 这是组件方法:

     openPopup(document : Document , size : string, title : string) {
    this.documentService.getDocumentFile(document)
           .toPromise().then((response : any) =>
            {  
              let parts = document.chemin.split(".") ;

             if(parts[parts.length -1] === "txt"){
              var file = new Blob([response.text()], {type: 
              'text/plain;charset=utf-8'});
              FileSaver.saveAs(file, 'fileDowloaded');
              this.popup.open(NguiMessagePopupComponent, {
              classNames: size,//large , medium , small
              title: title,
              message: response.text(),
              buttons: {
               OK: () => {
                  this.message = "Ok button is pressed";
                },
              CANCEL: () => {
                this.message = "Cancel button is pressed";
                 this.popup.close();}
              } });
             }
             if(parts[parts.length -1] === "pdf"){
              var file = new Blob([response.arrayBuffer()], {type: 
              'application/pdf;charset=UTF-8'});
              FileSaver.saveAs(file, 'fileDowloaded');
              this.popup.open(NguiMessagePopupComponent, {
              classNames: size,
              title: title,
              message: response.text(),
              buttons: {
               OK: () => {
                  this.message = "Ok button is pressed";
                },
              CANCEL: () => {
                this.message = "Cancel button is pressed";
                 this.popup.close();}
              } });
             }

        }
        ).catch(err=>"can't download file");

} }

and this is the service method: 这是服务方法:

    getDocumentFile(document : Document){
    let headers = new Headers(); 
    let responseType : ResponseContentType.ArrayBuffer ; 
    let options = new RequestOptions({ headers : headers ,withCredentials: 
    true , responseType});
    return this.http.get(super.getBaseUrl()
    +"gestionnaire/documents/file/"+document.id,options)
     }

I put response.blob() instead of response.arrayBuffer() but it is still not working. 我把response.blob()而不是response.arrayBuffer()但它仍然无法正常工作。

I had a simular problem, I've resolved that way : 我有一个类似的问题,我已经解决了这个问题:

In my service 在我的服务中

private options = new RequestOptions({ headers: new Headers({ 'Content-Type': 'application/pdf' })  , responseType : ResponseContentType.ArrayBuffer });
...
generatePDF( idJour: number): any {

    return this.http.get(`${this.resourceUrl}/presenceCantinePDF/${idJour}`, this.options
        ).map((res: any) => {
        return res;
    });
}

I call it : 我称之为:

generatePDF() {
        this.presenceSyntheseService.generatePDF(774).subscribe((res) => {
            console.log(res);
        const blob = new Blob([res._body], { type: 'application/pdf' });
          // window.open(URL.createObjectURL(blob));
            if (window.navigator && window.navigator.msSaveOrOpenBlob) {
                window.navigator.msSaveOrOpenBlob(blob, 'testss.pdf');
            } else {
                const a = document.createElement('a');
                a.href = URL.createObjectURL(blob);
                a.download = 'response.pdf';
                document.body.appendChild(a);
                a.click();
                document.body.removeChild(a);
            }
        });
    }

My Java code : 我的Java代码:

 @GetMapping(value = "/presence-synthese/presenceCantinePDF/{idJour}", produces = MediaType.APPLICATION_PDF_VALUE)
     public @ResponseBody ResponseEntity<InputStreamResource> getPDF(@PathVariable Long idJour) throws IOException {
         ByteArrayInputStream stream = presenceSyntheseService.generatePDF(idJour);
         HttpHeaders headers = new HttpHeaders();
         headers.add("Content-Disposition", "inline; filename=presenceCantine.pdf");
         //headers.add("Content-Disposition", "attachment; filename=ismael.pdf");
         return ResponseEntity
                 .ok()
                 .headers(headers)
                 .contentType(MediaType.APPLICATION_PDF)
                 .body(new InputStreamResource(stream));

     }

Good luck 祝好运

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM