在Bloular2中将Blob保存为xlsx

时间:2016-04-21 12:19:18

标签: angular blob

我在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

我做错的任何想法?

1 个答案:

答案 0 :(得分:5)

问题是开箱即用不支持二进制响应内容。您需要在底层XHR对象上“手动”设置响应类型

作为一种变通方法,您需要扩展Angular2的BrowserXhr类,如下所述,在基础xhr对象上设置responseTypeblob

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=>{
  (...)
});

有关详细信息,请参阅此问题: