2016-12-05 11 views
8

Я использую backend back и мой api использует службу для отправки данных через OutputStreamWriter. Я могу загрузить это в угловых 2 с помощью события щелчка, как так:Angular 2 download .CSV file click event с аутентификацией

Машинописи

results(){ 
window.location.href='myapicall'; 
} 

HTML

<button (click)="results()" 
        class="btn btn-primary">Export</button> 

Это работает просто отлично; однако недавно я реализовал безопасность для своих API-конечных точек, и теперь я получаю 401 каждый раз, когда я пытаюсь выполнить вызов, потому что он не отправляет заголовок.

Я написал службу, чтобы увидеть результаты на консоли, но я не могу понять, как загрузить файл.

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}); 
    } 



} 

Я попытался загрузки данных через сгустка, как предложено в этом посте: How do I download a file with Angular2

Файл, который получает Скачиваемый типа файла и содержание:

Ответ со статусом: 200 OK для URL: мой url

Фактически это не загружает данные.

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"); 



    } 

ответ

6

Похоже, вам просто нужно разобрать тело ответа т.е.

let parsedResponse = data.text(); 
this.downloadFile(parsedResponse); 

Кроме того, я бы рекомендовал использовать FileSaver для загрузки файлов, как и в 2016 году, кажется, не является стандартным способом для этого в браузерах.

let blob = new Blob([data], { type: 'text/csv' }); 
saveAs(blob, "data.txt"); 

Для более углубленных направляющих проверок here

+0

Это была проблема, спасибо! Я предполагаю, что могу, возможно, сделать карту для текста в моем сервисе. Я посмотрю на FileSaver.js, надеясь, что он исправит мою проблему сохранения в виде файла типа. – Bhetzie

+0

Вы знаете, что мне нужно добавить к моему компоненту, чтобы распознать функцию saveAs? Я попробовал: var FileSaver = require ('файл-saver'); но, похоже, не работает – Bhetzie

+1

какой загрузчик модуля вы используете? Я использую angular-cli, который использует веб-пакет. Чтобы включить сторонние библиотеки, вы добавляете путь к файлу в lib в 'angular-cli.json'. например, добавьте следующие «скрипты»: ["../node_modules/file-saver/FileSaver.js"], – shusson

 Смежные вопросы

  • Нет связанных вопросов^_^