2017-04-07 6 views
3

Dies ist der Code meines Dienstes Excel-Datei herunterladen, die mit Antwort eine xls-Datei Post-Anforderung macht:Wie man richtig mit Angular2

exportInternalOrder(body) { 
     let user_token: string = this.sessionService.getToken(); 
     let headers = new Headers(); 
     headers.append('responseType', 'arraybuffer'); 
     headers.append('Authorization', 'Bearer ' + user_token); 
     return this.http.post(this.config.exportInternalOrder, body,{ 
      headers: headers 
     }).map(res => new Blob([res._body],{ type: 'application/vnd.ms-excel' })); 
    } 

die angeblich Antwort von Excel-Datei zu behandeln. Dies ist der Code aufgerufen wird es:

let objToSend = this.makeObjToSend(false); 
this.reportingService.exportExcel(objToSend) 
    .subscribe(
     data => { 
      this.exportData(data); 
     }, 
     error => { 
      this.errorFilterMsg.push({ severity: 'error', detail: 'Report exporting has failed!' }); 
     } 
); 

Und dies ist das Speichern der Datei (aus irgendeinem Grunde window.open tut nichts):

exportData(data){  
     let blob = data; 
     let a = document.createElement("a"); 
     a.href = URL.createObjectURL(blob); 
     a.download = 'fileName.xls'; 
     document.body.appendChild(a); 
     a.click();   
    } 

Aber die Datei immer noch als beschädigt man spart. Bei Verwendung von Postman und Curl kommt es in Ordnung. Jede Hilfe wäre willkommen.

+0

könnten Sie uns die 'Daten' in' exportData (Daten) 'zeigen. will nur überprüfen, was in 'Daten' kommt. –

+0

Das ist, was für mich funktionierte: https://stackoverflow.com/questions/41771041/angular2-download-excel-file-from-web-api-file-is-corrupt/44680057#44680057 – Deepak

+0

Mögliche Duplikate von [Angular2 herunterladen Excel-Datei von Web-API, Datei ist beschädigt] (https://stackoverflow.com/questions/41771041/angular2-download-excel-file-from-web-api-file-is-corrupt) –

Antwort

8

responseType soll nicht in headers eingestellt wird, ist es Teil von RequestOptionsArgs Objekt ist, das als zweites Argument in post Funktion übergeben wird und RequestOptionsArgs enthält headers, responseType und andere, können Sie mehr darüber here lesen. Also, sollten Sie den Code wie folgt aussehen:

import { ResponseContentType } from '@angular/http'; 

exportInternalOrder(body) { 
    let user_token: string = this.sessionService.getToken(); 
    let headers = new Headers(); 
    headers.append('Authorization', 'Bearer ' + user_token); 
    return this.http.post(this.config.exportInternalOrder, body,{ 
     headers: headers, 
     responseType: ResponseContentType.Blob 
    }).map(res => new Blob([res._body],{ type: 'application/vnd.ms-excel' })); 
} 
+1

MY Serbische Nachbarschaft Freund !! ! Du kannst dir einfach nicht vorstellen, wie sehr du mir mit diesem Beitrag geholfen hast! Danke Danke und nochmal DANKE! –

+1

Ich tue dies: return this.http.post (Endpunkt, Körper, {response: ResponseContentType.Blob}). Karte ( (res) => { return res.blob() } ); Aber ich bekomme diesen Fehler: "Typ ResponseContentType.Blob ist nicht zu Typ JSON zuweisbar" ... Irgendeine Idee ?? –

1

Ich schreibe this..it für andere hilfreich sein, die für Angular 2 Lösung suchen Datei-Download-Funktionalität. Nachstehendes Stück Code funktioniert für mich.

import { ResponseContentType } from '@angular/http'; 

exportInternalOrder(body) { 
    let user_token: string = this.sessionService.getToken(); 
    let headers = new Headers(); 
    headers.append('Authorization', 'Bearer ' + user_token); 
    return this.http.post(this.config.exportInternalOrder, body,{ 
     headers: headers, 
     responseType: ResponseContentType.Blob}).map(res => new Blob([res.blob()],{ type: 'application/vnd.ms-excel' })); 
} 
Verwandte Themen