【问题标题】:BLOB to PDF download using Java and angular 5使用 Java 和 Angular 5 下载 BLOB 到 PDF
【发布时间】:2019-05-01 04:46:07
【问题描述】:

我正在尝试在角度 5 上实现从 db 下载 pdf 的逻辑。我在下载文件中遇到问题。文件已下载,但在打开时抛出错误 - “加载失败”。

我查看了很多博客和问题/答案,但无法在我的代码中找到错误。

In Database -> pdf file content saved as BLOB

Rest 网络服务 -> 在下面的代码中,pdfData 是来自 BLOB 类型列的数据,这里是 java 代码中的 byte[]

@GetMapping("downloadReport/{reportId}")
public StreamingResponseBody downloadDocument(byte[] pdfData) {
        return outputStream -> {
        //This way working for sample
            /*try (InputStream inputStream = new ByteArrayInputStream(
                    Files.readAllBytes(Paths.get("D:/pdfWithoutPassword.pdf")))) {
                IOUtils.copy(inputStream, outputStream);
            }*/
        //This way not working when data fetched from Database
            try (InputStream inputStream = new ByteArrayInputStream(pdfData)) {
                IOUtils.copy(inputStream, outputStream);
            }
            outputStream.close();
        };

Angular 5 代码

downloadReport(reportType: string, reportId: string) {
        let fileDownloadUrl = environment.apiUrl + "/downloadReport" + "/" + reportId;

        return this.httpClient
            .get(fileDownloadUrl, { observe: 'response', responseType: "blob"})
            .subscribe(response => this.saveFileToSystem(response.body)),
            error => console.log("Error downloading the file."),
            () => console.info("OK");
    }

       saveFileToSystem(input: any) {
        const blob = new Blob([input], { type: 'application/octet-stream' });
        saveAs(blob, "testingpdf1.pdf");
    }

寻求帮助以解决此问题。提前致谢!

【问题讨论】:

  • 你能分享 stackblitz 以便我们编辑吗?
  • 或您从服务器端获得的响应
  • 看看this
  • 感谢您的所有 cmets。检查一切,并会回复。还将根据 cmets 编辑 que

标签: java angular download blob


【解决方案1】:

这是我做的另一种方式,你可以改变:

@RequestMapping(value = "/generateReport", method = RequestMethod.POST)
  public ResponseEntity<byte[]> generateReport(){

    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.parseMediaType("application/pdf"));
    StringBuilder filename = new StringBuilder("MyPdfName").append(".pdf");

    byte[] bytes = pdfGeneratorService.generatePDF();
    headers.add("content-disposition", "inline;filename=" + filename.toString());

    headers.setCacheControl("must-revalidate, post-check=0, pre-check=0");
    ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(bytes, headers, HttpStatus.OK);
    return response;
}

【讨论】:

    【解决方案2】:

    试试这个:

    来自您的 html 页面

     <a href="javascript:void(0);" (click)="generatePdf()"> YourPdf.pdf </a>
    

    从你的 js 文件中

    generatePdf() {
    
    this.yourService.generatePdf()
         .subscribe(pdf => {
         let mediaType = 'application/pdf';
         let blob = new 
         Blob([this.converterService.base64ToArrayBuffer(pdf.pdfByteArray)], { type: mediaType });
        saveAs(blob, fileName);
      }, err => {
        console.log('Pdf generated err: ', JSON.stringify(err));
      });
    

    }

    您的转换器服务:

    import { Injectable } from "@angular/core";
    
    @Injectable()
    export class ConverterService {
    
    base64ToArrayBuffer(base64) {
        var binaryString = window.atob(base64);
        var binaryLen = binaryString.length;
        var bytes = new Uint8Array(binaryLen);
        for (var i = 0; i < binaryLen; i++) {
            var ascii = binaryString.charCodeAt(i);
            bytes[i] = ascii;
        }
          return bytes;
       }
      }
    

    【讨论】:

    • 谢谢@Irshaad,它与您的服务器端代码一起工作。但是在 UI 代码上做了一点小小的改动。我没有在 UI 端使用转换器服务。这是我的 UI 端代码:
    • downloadt(reportId: string) { let fileDownloadUrl = environment.apiUrl + "orderHistory/test"; return this.httpClient .get(fileDownloadUrl, { observe: 'response', responseType: "blob" }) .subscribe(response => {this.saveFile(response.body)}, err => { console.log('err : ', JSON.stringify(err)); }); } saveFile(input: any) { const blob = new Blob([input], { type: 'octet/stream' }); saveAs(blob, "a.pdf"); }
    猜你喜欢
    • 1970-01-01
    • 2018-10-06
    • 2019-03-28
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 2016-07-10
    相关资源
    最近更新 更多