web-dev-qa-db-fra.com

Angular 2 RC 5 Tentative d’obtenir et d’afficher un PDF à partir d'un serveur

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());
}
11
John

Essayez de définir le responseType à Blob, cela devrait fonctionner:

getBlob() {
return this.http.get(uri, {responseType: ResponseContentType.Blob})
.map(response => (<Response>response).blob());

}

23
fleske

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 :)

1
Mikhaël Gerbet

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);
}
0
Vitor M. Barbosa