2016-12-05 5 views
8

मैं एक वसंत बूट बैकएंड का उपयोग कर रहा हूं और मेरा एपीआई आउटपुटस्ट्रीमवाइटर के माध्यम से डेटा भेजने के लिए एक सेवा का उपयोग करता है। मैं बहुत की तरह एक क्लिक करें घटना का उपयोग कर कोणीय 2 में इस डाउनलोड कर सकते हैं:कोणीय 2 डाउनलोड .एसएसवी फ़ाइल प्रमाणीकरण के साथ घटना पर क्लिक करें

टाइपप्रति

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

एचटीएमएल

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

यह सिर्फ ठीक काम करता है; हालांकि, मैंने हाल ही में अपने एपीआई एंडपॉइंट्स के लिए सुरक्षा लागू की है और अब जब भी मैं कॉल करने की कोशिश करता हूं तो मुझे 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 यूआरएल के लिए ठीक है: मेरा यूआरएल

यह वास्तव में डेटा डाउनलोड नहीं करता है।

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

ऐसा लगता है कि तुम सिर्फ मैं तुम्हें FileSaver का उपयोग 2016 में के रूप में भी फ़ाइलों को डाउनलोड करने वहाँ एक मानक तरीका होना प्रतीत नहीं होता है की सिफारिश करेंगे यानी

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

भी प्रतिक्रिया का ढाँचा पार्स करने के लिए की जरूरत है ब्राउज़र में यह करने के लिए।

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

एक अधिक जानकारी के लिए गहराई गाइड की जांच here

+0

यही समस्या थी में, धन्यवाद! मुझे लगता है कि मैं शायद अपनी सेवा में पाठ के लिए एक नक्शा कर सकता हूं। मैं FileSaver.js पर एक नज़र डालेगा, उम्मीद कर रहा हूं कि यह टाइप फ़ाइल के रूप में सहेजने की मेरी समस्या को ठीक करेगा। – Bhetzie

+0

क्या आपको पता है कि saveAs फ़ंक्शन को पहचानने के लिए मुझे अपने घटक में क्या जोड़ना है? मैंने कोशिश की: var FileSaver = आवश्यकता ('फ़ाइल-सेवर'); लेकिन – Bhetzie

+1

काम नहीं कर रहा है आप किस मॉड्यूल लोडर का उपयोग कर रहे हैं? मैं कोणीय-क्ली का उपयोग कर रहा हूं जो वेबपैक का उपयोग करता है। तृतीय पक्ष libs को शामिल करने के लिए आप 'angular-cli.json' में libp में फ़ाइलपैथ जोड़ते हैं। उदाहरण के लिए निम्नलिखित स्क्रिप्ट जोड़ें: ["../node_modules/file-saver/FileSaver.js"], – shusson

संबंधित मुद्दे