我在 Angular2 应用程序中保存xlsx
时遇到了一些问题:
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
有什么想法我做错了吗?
问题是二进制响应内容不是现成支持的。您需要在底层 XHR 对象上"手动"设置响应类型
作为解决方法,您需要扩展 Angular2 的 BrowserXhr
类,如下所述,以将responseType
设置为在底层 xhr 对象上blob
:
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=>{
(...)
});
有关更多详细信息,请参阅此问题:
- Angular 2 从 API 下载 PDF 并将其显示在视图中