J'utilise un backend de démarrage de printemps et mon api utilise un service pour envoyer des données via OutputStreamWriter. Je peux télécharger cela dans Angular 2 à l'aide d'un événement de clic comme ceci:
Manuscrit
results(){ window.location.href='myapicall'; }
HTML
<button (click)="results()" class="btn btn-primary">Export</button>
Cela fonctionne très bien; Cependant, j'ai récemment mis en place la sécurité pour mes points d'extrémité api et maintenant je reçois un 401 chaque fois que j'essaie de faire l'appel car il n'émet pas d'en-tête.
J'ai écrit un service que je peux voir les résultats dans la console, mais je n'arrive pas à comprendre comment télécharger le fichier.
TéléchargerFileService
import {Injectable} from '@angular/core'; import { Http, Headers } from '@angular/http'; import 'rxjs/Rx'; @Injectable() export class DownloadFileService { headers:Headers; bearer: string; constructor(public http: Http) {} getFile(url:string) { this.bearer = 'Bearer '+ localStorage.getItem('currentUser'); this.headers = new Headers(); this.headers.append('Authorization', this.bearer); return this.http.get(url, {headers: this.headers}); } }
J'ai essayé de télécharger les données via un blob comme suggéré dans cette publication: Comment puis-je télécharger un fichier avec Angular2
Le fichier téléchargé est de type Fichier et le contenu est:
Réponse avec statut: 200 OK pour URL: mon URL
Il ne télécharge pas réellement les données.
downloadFile(data: any){ var blob = new Blob([data], { type: 'text/csv' }); var url= window.URL.createObjectURL(blob); window.open(url); } results(){ // window.location.href='myapicall'; let resultURL = 'myapicall'; this.downloadfileservice.getFile(resultURL).subscribe(data => this.downloadFile(data)),//console.log(data), error => console.log("Error downloading the file."), () => console.info("OK"); }
On dirait que vous devez simplement analyser le corps de la réponse, c'est-à-dire
let parsedResponse = data.text(); this.downloadFile(parsedResponse);
De même, je vous recommande d'utiliser FileSaver pour télécharger des fichiers car, même en 2016, il ne semble pas y avoir de moyen standard pour le faire dans les navigateurs.
let blob = new Blob([data], { type: 'text/csv' }); saveAs(blob, "data.txt");
Pour un guide plus approfondi, vérifiez ici