2016-04-21 9 views
5

में xlsx के रूप में मैं अपने Angular2 अनुप्रयोग में xlsx बचत के साथ कुछ मुद्दों है:बचत ब्लॉब Angular2

this._http.get('/api/file).subscribe(success=>{ 
       var blob = new Blob([success.json()], { 
        type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' 
       }); 
       var downloadUrl= window.URL.createObjectURL(blob); 
       window.open(downloadUrl); 

      }, error=>{ 

      }); 

प्रतिक्रिया मैं बैकएंड से प्राप्त निम्नलिखित रूप में है:

PK�q�H_rels/.rels���j�0��} 
�{㴃1F�^Ơ�2��l%1I,c�[��3�l 
l�����H��4��R�l��·����q}*�2�������;�*�� 
t"�^�l;1W)�N�iD)ejuD�cKz[׷:}g����@:�.... etc 

कोई भी विचार जहां मैं गलती कर रहा हूँ?

उत्तर

5

समस्या यह है कि बाइनरी प्रतिक्रिया सामग्री बॉक्स के बाहर समर्थित नहीं है।

: आप "मैन्युअल" अंतर्निहित एक्सएचआर वस्तु

पर प्रतिक्रिया प्रकार सेट करने के समाधान के लिए की जरूरत है, आप के रूप में अंतर्निहित XHR वस्तु पर नीचे वर्णित blob को responseType स्थापित करने के लिए Angular2 की BrowserXhr वर्ग का विस्तार करने की जरूरत है

import {Injectable} from 'angular2/core'; 
import {BrowserXhr} from 'angular2/http'; 

@Injectable() 
export class CustomBrowserXhr extends BrowserXhr { 
    constructor() {} 
    build(): any { 
    let xhr = super.build(); 
    xhr.responseType = "blob"; 
    return <any>(xhr); 
    } 
} 

प्रदाताओं में इस कक्षा को पंजीकृत करने के बाद सावधान रहें क्योंकि यह वैश्विक है। आपको इसे केवल उस घटक के भीतर सेट करना चाहिए जो अनुरोध निष्पादित करता है। आप मामले में, आप प्रतिक्रिया डेटा की एक स्ट्रिंग प्रतिनिधित्व प्राप्त ...

@Component({ 
    (...) 
    providers: [ 
    provide(BrowserXhr, { useClass: CustomBrowserXhr }) 
    ] 
}) 
export class ... 

तो फिर तुम प्रतिक्रिया ऑब्जेक्ट की _body संपत्ति से डेटा प्राप्त करने की जरूरत है।

this._http.get('/api/file).subscribe(success => { 
    var blob = new Blob([success._body], { 
       type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' 
    }); 
    var downloadUrl= window.URL.createObjectURL(blob); 
    window.open(downloadUrl); 
}, error=>{ 
    (...) 
}); 

अधिक जानकारी के लिए इस सवाल का देखें::

+1

thats महान के बाद से यह एक आंतरिक एक है लेकिन वहाँ कोई दूसरा रास्ता अभी है आप आम तौर पर इस्तेमाल करना चाहिए! मैं परीक्षण कर रहा हूं, और मैं आपको बता दूंगा कि यह – uksz

+2

कैसे चल रहा है यह काम कर रहा था, लेकिन यह वर्तमान कोणीय 2 संस्करण के साथ नहीं है। '_body' अब निजी है लेकिन आप इसे 'सफलता [' _ body ']' के साथ एक्सेस कर सकते हैं। – Christoph