从响应中提取图像数据:Angular2

shi*_*hiv 5 angular

响应具有图像数据,但我无法从响应中提取它.

客户代码 -

download() {
    this._http.get('http://localhost:9000/download/' + this._fileid)
    .subscribe(
    data => {
        this.image = data;
    },
    err => console.log('Error is..:' + err)
    );
}
Run Code Online (Sandbox Code Playgroud)

服务器代码 -

app.get('/download/:fileid', function(req, res) {
    var id = req.params.fileid;
    res.set('Content-Type', 'image/jpeg');
    gfs.createReadStream({_id: id}).pipe(res);
});
Run Code Online (Sandbox Code Playgroud)

[编辑] - 我已经调整了我的代码以使用CustomXhr但是我得到一个没有数据的空blob.

CUSTOM XHR代码 -

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

BOOTSTRAP CODE-导出函数main(initialHmrState?:any):Promise {

export function main(initialHmrState?: any): Promise<any> {

  return bootstrap(App, [
    ...ENV_PROVIDERS,
    ...PROVIDERS,
    ...DIRECTIVES,
    ...PIPES,
    ...APP_PROVIDERS,
     provide(BrowserXhr, { useClass: CustomBrowserXhr })
  ])
  .catch(err => console.error(err));
}
Run Code Online (Sandbox Code Playgroud)

HTTP请求 -

download() {
  this._http.get('http://localhost:9000/download/' + this._fileid)
    .toPromise()
    .then(res => {
      if (res.headers.get("Content-Type").startsWith("image/")) {
          var blob = new Blob([new Uint8Array(res._body)], {
              type: res.headers.get("Content-Type")
          });
          var urlCreator = window.URL;
          var url = urlCreator.createObjectURL(blob);
          console.log(url);
          this.image = url;
      }
    })
}
Run Code Online (Sandbox Code Playgroud)

Abd*_*yer 12

你在寻找什么arrayBuffer().您的代码将是:

download() {
    this._http.get('http://localhost:9000/download/' + this._fileid)
    .subscribe(
    data => {
        this.image = data.arrayBuffer();
    },
    err => console.log('Error is..:' + err)
    );
}
Run Code Online (Sandbox Code Playgroud)

但遗憾的arrayBuffer()是,从测试版开始尚未实施.

你可以改用XMLHttpRequest,这是一个傻瓜

getImage(url:string){ 
 return Observable.create(observer=>{
  let req = new XMLHttpRequest();
  req.open('get',url);
  req.responseType = "arraybuffer";
  req.onreadystatechange = function() {
    if (req.readyState == 4 && req.status == 200) {
      observer.next(req.response);
      observer.complete();
    }
  };
  req.send();
 });
}
Run Code Online (Sandbox Code Playgroud)