J'essaie d'afficher un PDF généré à partir d'un serveur sur une vue de mon projet Angular 2 RC 5. À l'heure actuelle, le serveur ASPNETCORE renvoie l'objet en tant que "application/pdf" et le client Angular tente d'analyser la réponse sous forme de blob. Cependant, j'obtiens l'erreur suivante du côté client:
Error: The request body isn't either a blob or an array buffer
Le code que j'utilise pour appeler le serveur PDF est essentiellement le suivant:
getHeaders() : Headers {
var headers = new Headers({
'responseType': 'application/blob'
});
return headers;
}
getBlob() {
return this.http.get(uri, new RequestOptions({headers: this.getHeaders()}, body: "" }))
.map(response => (<Response>response).blob());
}
Essayez de définir le responseType à Blob, cela devrait fonctionner:
getBlob() {
return this.http.get(uri, {responseType: ResponseContentType.Blob})
.map(response => (<Response>response).blob());
}
Travaille pour moi :
Composant:
downloadInvoice(invoice) {
this.loading = true;
this.invoiceDataService
.downloadInvoice(invoice)
.subscribe(
(blob) => {
FileSaver.saveAs(blob, 'test.pdf');
},
error => this.error = error,
() => {
this.loading = false;
console.log('downloadInvoices : Request Complete')
}
)
}
Service de données:
downloadInvoice(invoice): Observable<Blob> {
return this.api.downloadInvoice(invoice);
}
Service Api:
downloadInvoice(invoice: Invoice): Observable<Blob> {
return this.authHttp
.get(this.apiBase + '/invoices/' + invoice.hashid + '/download', {responseType: ResponseContentType.Blob})
.map(response => {
return new Blob([response.blob()], {type: 'application/pdf'});
})
.catch(this.handleError.bind(this));
}
Prendre plaisir :)
Pour Angular 5, ResponseContentType
a été obsolète , une solution courante que j'ai trouvée consistait à utiliser:
getFile(): Observable<File> {
let options = {
headers: new HttpHeaders({ 'Content-Type': 'application/json' }),
responseType: 'blob' as 'json'
};
return this.http.get<File>(uri, options);
}