Ссылка на скачивание не определена при получении потока байтов в Angular - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь сгенерировать pdf-файл из конечной точки, функция showPDF имеет параметр ID для Product и генерирует pdf в качестве вывода.

Я пытался объявить Promise для получения поток байтов из этой конечной точки:

    showPdf(rowData: Product) {

    console.log("ID = >" + rowData.id);

    let promise = new Promise((resolve, reject) => {
      let apiURL = this.apiUrl + "/api/products/get/pdf/"+rowData.id;
      this.http.get(apiURL)
      .toPromise()
      .then(
        res => { // Success

        this.results = String(res);
        console.log("Bytes=> " + res);

        resolve();
        },
        msg => { // Error
        reject(msg);
        }
      );
  });  
    const bytes = this.results; 
    const linkSource = 'data:application/pdf;base64,'+ bytes;
    const downloadLink = document.createElement("a");
    const fileName = "Report.pdf";

    downloadLink.href = linkSource;
    downloadLink.download = fileName;
    console.log("downloadLink = >" + downloadLink);
    downloadLink.click();
}

Проблема в том, что ссылка для скачивания выполняется до получения результата от Promise.

Например, при вызове showPDF (942) я получаю неопределенное значение ссылки для скачивания

enter image description here

При вызове showPDF для того же идентификатора или другого значения идентификатора генерируется PDF, но из предыдущего значения потока байтов получил от Обещания.

1 Ответ

0 голосов
/ 12 марта 2020

Вы можете попробовать вот так

showPdf(rowData: Product) {
    console.log("ID = >" + rowData.id);
    let promise = new Promise((resolve, reject) => {
      let apiURL = this.apiUrl + "/api/products/get/pdf/"+rowData.id;
      this.http.get(apiURL)
      .toPromise()
      .then(
        res => { // Success

        this.results = String(res);
        console.log("Bytes=> " + res);
// here after getting the result we are calling the another function to download the PDF
        this.downLoadPdf();
        resolve();
        },
        msg => { // Error
        reject(msg);
    }
   );
  });  
}

downLoadPdf() {
    const bytes = this.results; 
    const linkSource = 'data:application/pdf;base64,'+ bytes;
    const downloadLink = document.createElement("a");
    const fileName = "Report.pdf";

    downloadLink.href = linkSource;
    downloadLink.download = fileName;
    console.log("downloadLink = >" + downloadLink);
    downloadLink.click();
}
...