typescript - descărcarea fișierului xlsx în angular 2 cu blob
Vreau să descarc un fișier xlsx de la client pe Angular 2 folosind API-ul REST.
Primesc un array de biți ca răspuns la cererea mea GET și îl trimit funcției de descărcare cu subscribe:
let options = new RequestOptions({ search: params });
this.http.get(this.restUrl, options)
.subscribe(this.download);
funcție de descărcare folosind blob:
download(res: Response) {
let data = new Blob([res.arrayBuffer()], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;' });
FileSaver.saveAs(data, this.fileName);};
Problema mea este că fișierul meu este corupt tot timpul. Am încercat multe versiuni ale acestuia, dar nimic nu funcționează.
** de asemenea am încercat cu această soluție și nu funcționează (fișierul xlsx este încă corupt) - Angular 2 descărcarea unui fișier: rezultat corupt, diferența este că datele mele sunt un Buffer de tip array și nu un string sau json, și există o diferență între PDF și xlsx.
Mulțumesc de 10 ori!
Răspuns #1
Am avut aceeași problemă ca a ta - am rezolvat-o adăugând responseType: ResponseContentType.Blob la opțiunile mele Get. Verifică codul de mai jos:
public getReport(filters: ReportOptions) {
return this.http.get(this.url, {
headers: this.headers,
params: filters,
responseType: ResponseContentType.Blob
})
.toPromise()
.then(response => this.saveAsBlob(response))
.catch(error => this.handleError(error));
}
Funcția saveAsBlob() este doar un înveliș pentru FileSaver.SaveAs():
private saveAsBlob(data: any) {
const blob = new Blob([data._body],
{ type: 'application/vnd.ms-excel' });
const file = new File([blob], 'report.xlsx',
{ type: 'application/vnd.ms-excel' });
FileSaver.saveAs(file);
}
Răspunsul #2
După ce nimic nu funcționează. Mi-am schimbat serverul pentru a returna aceeași matrice de octeți cu adăugarea de:
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition", "attachment; filename=deployment-definitions.xlsx");
La clientul meu am șters funcția de descărcare și în loc de partea GET am făcut:
window.open(this.restUrl, "_blank");
Aceasta este singura modalitate pe care am găsit-o posibilă pentru a salva un fișier xlsx care nu este corupt.
Dacă ai un răspuns despre cum să faci asta cu blob, te rog să-mi spui :)
