J'utilise un backend Spring Boot et mon API utilise un service pour envoyer des données via un OutputStreamWriter. Je peux le télécharger dans Angular 2 en utilisant un événement de clic comme ceci:
TypeScript
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 implémenté la sécurité pour mes points finaux api et maintenant je reçois un 401 chaque fois que j'essaie de faire l'appel parce qu'il n'envoie pas d'en-tête.
J'ai écrit un service dont je peux voir les résultats dans la console, mais je n'arrive pas à comprendre comment télécharger le fichier.
DownloadFileService
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 cet article: Comment télécharger un fichier avec Angular2
Le fichier téléchargé est de type Fichier et le contenu est:
Réponse avec état: 200 OK pour l'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 avez juste besoin d'analyser le corps de la réponse, c'est-à-dire
let parsedResponse = data.text();
this.downloadFile(parsedResponse);
Je vous recommande également d'utiliser FileSaver pour télécharger des fichiers car même en 2016, il ne semble pas y avoir de moyen standard de le faire sur tous les navigateurs.
let blob = new Blob([data], { type: 'text/csv' });
saveAs(blob, "data.txt");
Pour un guide plus approfondi, consultez ici
J'utilise également FileSaver
. Si vous avez une extension côté client, vous pouvez voir qu'elle fonctionnera correctement pour les fichiers CSV
. Il vous suffit d'ajouter manuellement l'extension:
FileSaver.saveAs(res, 'export' + extension);