我正在嘗試使用 Angular 和 Spring Boot 保存 PDF。
當我進行 API 呼叫時,我的 Java 代碼從資料庫中獲取資料并將其轉換為位元組流。該流作為回應發送。
if(format.equals(Constant.PDF_FORMAT)) {
ByteArrayInputStream stream = reportPDF.generateReportDocument(dtos);
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Disposition", "inline; filename=report.pdf");
return ResponseEntity.ok()
.headers(headers)
.contentType(MediaType.APPLICATION_PDF)
.body(new InputStreamResource(stream));
}
我必須使用此回應并將資料保存為 PDF。
組件.ts
public getReports(type?: string): void {
this.params['expected-format'] = type;
if (type === 'json') {
this.Service.getPilotReports(this.params).subscribe((res) => {
this.reportsData = res;
this.pilotBankSpinnerService.closeSpinner();
});
} else {
this.Service.customGetForDownload(this.params).subscribe(
(data: Blob) => {
var file = new Blob([data], { type: 'application/pdf' });
var fileURL = URL.createObjectURL(file);
window.open(fileURL);
var a = document.createElement('a');
a.href = fileURL;
a.target = '_blank';
a.download = 'reports.pdf';
document.body.appendChild(a);
a.click();
},
(error) => {
console.log('getPDF error: ', error);
}
);
}
}
服務.ts
public customGetForDownload<blob, T>(url: string, params: any): any {
const headers = new HttpHeaders({ 'Content-Type': 'application/json', responseType: 'blob' });
const httpParams = this.http.constructParams(params);
const absoluteUrl = this.getAbsoluteUrl(url);
return this.httpClient.get(absoluteUrl, {
headers: headers,
params: httpParams,
responseType: 'blob' as 'json',
observe: 'response',
});
}
雖然檔案正在保存。當我嘗試打開檔案時,它顯示“無法加載 pdf 檔案”。
uj5u.com熱心網友回復:
語法問題
首先我看到一個語法錯誤:
- 方法呼叫中缺少引數:(
ByteArrayInputStream stream = reportPDF.generateReportDocument(dtos, );逗號后)
由于此語法錯誤,您很可能會在控制臺上收到編譯錯誤。
假設這是一個失誤,您可以將其修復為類似的內容,ByteArrayInputStream stream = reportPDF.generateReportDocument(dtos);然后它應該可以編譯。
靴子沒有錯誤?然后測驗端點!
進一步假設您的服務器應用程式啟動和運行沒有錯誤,那么您可以使用 HTTP 呼叫測驗 HTTP 端點。
您可以使用 HTTP 客戶端(如 CURL、郵遞員甚至瀏覽器)進行測驗。
然后你應該收到一個帶有 HTTP 狀態代碼 200 的回應和包含 PDF 檔案作為二進制檔案的回應,帶有 MIME 型別application/pdf和指定的 header Content-Dispositon。
瀏覽器應該會提示您下載對話。
在 Spring 中使用二進制檔案進行回應
你InputStreamResource是一個有效的方法,但你在使用它時應該有信心。
在 Spring 控制器方法中,您可以回傳不同型別的二進制資料:
ResponseEntity<byte[]>作為位元組陣列ResponseEntity<ByteArrayOutputStream>作為流(不是用于讀取輸入的輸入流)ResponseEntity<Resource>作為抽象的二進制內容,請參閱 Spring 的ResourceResponseEntity<File>作為整個檔案
也可以看看
- Spring Boot Angular2 檔案下載不起作用
- PDF Blob 未顯示內容,Angular 2
- 使用spring MVC回傳生成的pdf
還有一些回應導向的方式,尤其是在 Spring 中:
InputStreamResource像你一樣回傳 a- 回個
StreamingResponseBody很方便 - 寫入 a
HttpServletResponse,可能是最古老的方式
請參閱:如何在 Spring Boot 中直接從 URL 下載檔案
從輸入到輸出
請記住:輸入用于讀取(例如來自請求),輸出用于寫入(例如回應)。因此,您的回應主體需要一個輸出型別,例如byte[]或ByteArrayOutputStream等。
讀取輸入時,ByteArrayInputStream stream您可以使用 Apache-Commons IOUtils :將輸入從該輸入復制到輸出流IOUtils.copy(in, out);。或者簡單地回傳位元組陣列:byte[] data = stream.readAllBytes();
請參閱:Java InputStream 到位元組陣列和 ByteBuffer | 巴東
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/373301.html
