我有一个JWT授权的图像端点,因此我们不能直接在HTML中链接到图像URL。
解决方法是使用异步管道加载具有正确授权的图像(通过HTTP拦截器实现,未显示),并将img.src属性设置为“对象” URL。
HTML:
<img [attr.src]="environment.apiUrl + 'users/image/' + userId | secureImage | async" alt="Avatar" />
管道:
import { Pipe, PipeTransform } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { DomSanitizer, SafeUrl } from '@angular/platform-browser';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
@Pipe({
name: 'secureImage'
})
export class SecureImagePipe implements PipeTransform {
constructor(private http: HttpClient, private sanitizer: DomSanitizer) { }
transform(url): Observable<SafeUrl> {
return this.http
.get(url, { responseType: 'blob' })
.pipe(map(val => this.sanitizer.bypassSecurityTrustUrl(URL.createObjectURL(val))));
}
}
如您在此GIF中所见,当图像从加号(静态)变为荷马大脑(通过此管道加载)时,会出现非常短暂的闪烁,同时显示经典的“图片未找到”和alt文本(Avatar)。
我该如何防止这种闪烁?
更新:删除“alt”属性可消除“损坏的图片”图像,看起来更好。
因此,从这个方面来看:
<img [attr.src]="environment.apiUrl + 'users/image/' + userId | secureImage | async" alt="Avatar" />
转换为:
<img [attr.src]="environment.apiUrl + 'users/image/' + userId | secureImage | async" />
我将保持这个问题处于开放状态,因为可能有人必须使用alt属性,所以我的解决方案对他们来说无效。