typescript - Ladda ner Excel-fil med exakt filnamn i Angular


Hur laddar jag ner en Excel-fil med det filnamn som returneras av tjänsten i min Angular-applikation? Jag använder file-saver-biblioteket. Här är min kod:

let blob = new Blob([response],  {type: 'application/vnd.openxmlformat-officedocument.spreadsheetml.sheet;'});
saveAs(blob, 'hello.xlsx');

Detta är svaret från Angular-tjänsten:

return this.http.get(`${this.reportsUrl}`, { responseType: 'blob'});

Svar från min backend-tjänst (Spring MVC). excelCreatedResource är av typen org.springframework.core.io.Resource:

return ResponseEntity.ok()
                .contentType(MediaType.parseMediaType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"))
                .header(HttpHeaders.CONTENT_DISPOSITION,
                "attachment; filename=\"" + excelCreateResource.getFilename() + "\"")
                .body(excelCreateResource);

Jag vill inte tillhandahålla hello.xlsx. Istället vill jag bara ladda ner filen utan att ändra filnamnet som returneras av tjänsten. Om jag får åtkomst till URL:en direkt från webbläsaren kan jag ladda ner Excel-filen.

Svar #1

Enligt din fråga tror jag att du behöver observera hela svaret och hämta headerdetaljerna från det. I Angular kan du göra detta genom att använda

let observable$ = this.http.get(`${this.reportsUrl}`, { observe: 'response'});
observable$.subscribe(response => {
  let blobObj = response.body; // this should be your blob object (body of response)
  let headers = response.Headers //This is a disctionary/HashMap were you'll find the content-desposition header

//.....

})  

Svar #2

Om excelCreateResource.getFilename(); returnerar ett filnamn, kan du lagra filnamnet i en lokal variabel och skicka denna variabel i saveAs()-metoden som:

var filename = excelCreateResource.getFilename();
saveAs(blob, filename );

Kanske det fungerar för dig.