【问题标题】:Extracting Image Data from response: Angular 2从响应中提取图像数据:Angular 2
【发布时间】:2019-04-02 21:23:39
【问题描述】:

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

客户代码-

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

服务器代码-

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

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

自定义 XHR 代码-

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

引导代码-

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));
}

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;
      }
    })
}

【问题讨论】:

    标签: angular


    【解决方案1】:

    您正在寻找的是arrayBuffer()。您的代码将是:

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

    但是,不幸的是,arrayBuffer() 在 beta.13 中尚未实现。

    您可以改用XMLHttpRequestHere is a plunker

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

    【讨论】:

    • @shiv 不客气,当然这只是一种解决方法,直到 arrayBufferblob 在 angular2 中实现
    【解决方案2】:

    事实上,目前并没有那么简单,因为您无法使用 Angular2 对请求设置 responseType 属性(对此有待处理的 PR)。

    作为一种解决方法,您需要如下所述扩展 Angular2 的 BrowserXhr 类,以便在底层 xhr 对象上将 responseType 设置为 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);
      }
    }
    

    然后您需要将响应负载包装到Blog 对象中:

    downloadFile() {
      this.http.get(
      this.http.get(
           'https://mapapi.apispark.net/v1/images/sparky_right.png')
        .subscribe(
          (response) => {
            var mediaType = 'image/png';
            var blob = new Blob([response._body], {type: mediaType});
            (...)
          });
    }
    

    查看此插件:查看此插件:http://plnkr.co/edit/2ZodNBmv8OVj3LZSrozG?p=preview

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

    【讨论】:

    • 嗨,他们,我试过你的方法。但我得到一个空的 blob。
    • 嘿!真的吗?你试过我的 plunkr 吗?我得到了这个Blob {size: 8914, type: "image/png"}。您是否添加了 CustomBrowserXhr 类的提供者?
    • 你能看看我在帖子中的编辑吗?是的,我试过你的 plunkr。它在那里工作得很好。所以我做错了什么。
    • 你应该删除 new Uint8Array(...) ;-) 我用完整的链更新了我的 plunkr
    猜你喜欢
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 2023-03-04
    • 2022-01-22
    • 2017-05-30
    相关资源
    最近更新 更多