使用 http 获取图像或字节数据
Get Image or byte data with http
对于 Web 应用程序,我需要通过 ajax 请求获取图像,因为我们的 API 上有签名 + 身份验证,所以我们无法使用简单的 [=13] 获取图像=]
因为我们使用的是 angular2,所以我们显然在寻找 blob 或类似的东西,但正如 static_response.d.ts
文件中所述:
/**
* Not yet implemented
*/
blob(): any;
好吧,我暂时做不到,我必须等待这个功能实现。
但问题是我等不及了,所以我需要一个修补程序或一些小技巧才能从响应中获取图像数据,我将能够删除我的技巧并设置 blob()
方法叫好什么时候实施。
我试过这个:
export class AppComponent {
constructor(private api:ApiService, private logger:Logger){}
title = 'Tests api';
src='http://placekitten.com/500/200'; //this is src attribute of my test image
onClick(){ //Called when I click on "test" button
this.api.test().then(res => {
console.log(res._body);
var blob = new Blob([new Uint8Array(res._body)],{
type: res.headers.get("Content-Type")
});
var urlCreator = window.URL;
this.src = urlCreator.createObjectURL(blob);
});
}
}
使用ApiService.test()
方法:
test():Promise<any> {
return this.http.get(this._baseUrl + "myapi/example/145", this.getOptions())
//getOptions() is just creating three custom headers for
//authentication and CSRF protection using signature
.toPromise()
.then(res => {
this.logger.debug(res);
if(res.headers.get("Content-Type").startsWith("image/")){
return res;
}
return res.json();
})
.catch(res => {
this.logger.error(res);
return res.json();
} );
}
但我没有从中获取任何图像,记录响应数据显示一个大字符串,它是图像数据。
你有实现这个的技巧吗?
这个 JSFiddle 可以帮助您:
https://jsfiddle.net/virginieLGB/yy7Zs/936/
如您所愿,方法是根据提供的URL创建一个Blob
// Image returned should be an ArrayBuffer.
var xhr = new XMLHttpRequest();
xhr.open( "GET", "https://placekitten.com/500/200", true );
// Ask for the result as an ArrayBuffer.
xhr.responseType = "arraybuffer";
xhr.onload = function( e ) {
// Obtain a blob: URL for the image data.
var arrayBufferView = new Uint8Array( this.response );
var blob = new Blob( [ arrayBufferView ], { type: "image/jpeg" } );
var urlCreator = window.URL || window.webkitURL;
var imageUrl = urlCreator.createObjectURL( blob );
var img = document.querySelector( "#photo" );
img.src = imageUrl;
};
xhr.send();
我认为您没有按照您的要求设置 responseType
。现在有点棘手,因为它不受支持。
解决方法是覆盖 BrowserXhr
class 以在 xhr
对象本身上设置 responseType
...
您可以扩展 BrowserXhr
:
@Injectable()
export class CustomBrowserXhr extends BrowserXhr {
constructor() {}
build(): any {
let xhr = super.build();
xhr.responseType = 'arraybuffer';
return <any>(xhr);
}
}
并使用扩展 class:
覆盖 BrowserXhr
提供程序
bootstrap(AppComponent, [
HTTP_PROVIDERS,
provide(BrowserXhr, { useClass: CustomBrowserXhr })
]);
这里的问题是您没有覆盖所有请求。在 bootstrap 级别,它将覆盖所有内容。因此,您可以在受影响组件的 providers
属性内的子注入器中提供它...
这是一个有效的插件:https://plnkr.co/edit/tC8xD16zwZ1UoEojebkm?p=preview。
不再需要扩展 BrowserXhr
。 (使用 angular 2.2.1 测试)
RequestOptionsArgs 现在有一个 属性 responseType: ResponseContentType
可以设置为 ResponseContentType.Blob
使用 DomSanitizer
import {DomSanitizer} from '@angular/platform-browser';
此示例还创建了一个经过清理的 url,它可以绑定到 <img>
的 src
属性
this.http.get(url, {
headers: {'Content-Type': 'image/jpg'},
responseType: ResponseContentType.Blob
})
.map(res => {
return new Blob([res._body], {
type: res.headers.get("Content-Type")
});
})
.map(blob => {
var urlCreator = window.URL;
return this.sanitizer.bypassSecurityTrustUrl(urlCreator.createObjectURL(blob));
})
使用新的 Angular HttpClient 很容易做到这一点。离开 tschuege 的方法,它将是:
return this._http.get('/api/images/' + _id, {responseType: 'blob'}).map(blob => {
var urlCreator = window.URL;
return this._sanitizer.bypassSecurityTrustUrl(urlCreator.createObjectURL(blob));
})
关键是将 responseType 设置为 'blob',这样它就不会尝试将其解析为 JSON
对于 Web 应用程序,我需要通过 ajax 请求获取图像,因为我们的 API 上有签名 + 身份验证,所以我们无法使用简单的 [=13] 获取图像=]
因为我们使用的是 angular2,所以我们显然在寻找 blob 或类似的东西,但正如 static_response.d.ts
文件中所述:
/**
* Not yet implemented
*/
blob(): any;
好吧,我暂时做不到,我必须等待这个功能实现。
但问题是我等不及了,所以我需要一个修补程序或一些小技巧才能从响应中获取图像数据,我将能够删除我的技巧并设置 blob()
方法叫好什么时候实施。
我试过这个:
export class AppComponent {
constructor(private api:ApiService, private logger:Logger){}
title = 'Tests api';
src='http://placekitten.com/500/200'; //this is src attribute of my test image
onClick(){ //Called when I click on "test" button
this.api.test().then(res => {
console.log(res._body);
var blob = new Blob([new Uint8Array(res._body)],{
type: res.headers.get("Content-Type")
});
var urlCreator = window.URL;
this.src = urlCreator.createObjectURL(blob);
});
}
}
使用ApiService.test()
方法:
test():Promise<any> {
return this.http.get(this._baseUrl + "myapi/example/145", this.getOptions())
//getOptions() is just creating three custom headers for
//authentication and CSRF protection using signature
.toPromise()
.then(res => {
this.logger.debug(res);
if(res.headers.get("Content-Type").startsWith("image/")){
return res;
}
return res.json();
})
.catch(res => {
this.logger.error(res);
return res.json();
} );
}
但我没有从中获取任何图像,记录响应数据显示一个大字符串,它是图像数据。
你有实现这个的技巧吗?
这个 JSFiddle 可以帮助您: https://jsfiddle.net/virginieLGB/yy7Zs/936/
如您所愿,方法是根据提供的URL创建一个Blob
// Image returned should be an ArrayBuffer.
var xhr = new XMLHttpRequest();
xhr.open( "GET", "https://placekitten.com/500/200", true );
// Ask for the result as an ArrayBuffer.
xhr.responseType = "arraybuffer";
xhr.onload = function( e ) {
// Obtain a blob: URL for the image data.
var arrayBufferView = new Uint8Array( this.response );
var blob = new Blob( [ arrayBufferView ], { type: "image/jpeg" } );
var urlCreator = window.URL || window.webkitURL;
var imageUrl = urlCreator.createObjectURL( blob );
var img = document.querySelector( "#photo" );
img.src = imageUrl;
};
xhr.send();
我认为您没有按照您的要求设置 responseType
。现在有点棘手,因为它不受支持。
解决方法是覆盖 BrowserXhr
class 以在 xhr
对象本身上设置 responseType
...
您可以扩展 BrowserXhr
:
@Injectable()
export class CustomBrowserXhr extends BrowserXhr {
constructor() {}
build(): any {
let xhr = super.build();
xhr.responseType = 'arraybuffer';
return <any>(xhr);
}
}
并使用扩展 class:
覆盖BrowserXhr
提供程序
bootstrap(AppComponent, [
HTTP_PROVIDERS,
provide(BrowserXhr, { useClass: CustomBrowserXhr })
]);
这里的问题是您没有覆盖所有请求。在 bootstrap 级别,它将覆盖所有内容。因此,您可以在受影响组件的 providers
属性内的子注入器中提供它...
这是一个有效的插件:https://plnkr.co/edit/tC8xD16zwZ1UoEojebkm?p=preview。
不再需要扩展 BrowserXhr
。 (使用 angular 2.2.1 测试)
RequestOptionsArgs 现在有一个 属性 responseType: ResponseContentType
可以设置为 ResponseContentType.Blob
使用 DomSanitizer
import {DomSanitizer} from '@angular/platform-browser';
此示例还创建了一个经过清理的 url,它可以绑定到 <img>
src
属性
this.http.get(url, {
headers: {'Content-Type': 'image/jpg'},
responseType: ResponseContentType.Blob
})
.map(res => {
return new Blob([res._body], {
type: res.headers.get("Content-Type")
});
})
.map(blob => {
var urlCreator = window.URL;
return this.sanitizer.bypassSecurityTrustUrl(urlCreator.createObjectURL(blob));
})
使用新的 Angular HttpClient 很容易做到这一点。离开 tschuege 的方法,它将是:
return this._http.get('/api/images/' + _id, {responseType: 'blob'}).map(blob => {
var urlCreator = window.URL;
return this._sanitizer.bypassSecurityTrustUrl(urlCreator.createObjectURL(blob));
})
关键是将 responseType 设置为 'blob',这样它就不会尝试将其解析为 JSON