En supposant que vous ayez implémenté un HttpIntercepter pour ajouter l'en-tête, voici une solution qui fonctionne réellement (en Angular 4) :
import { Pipe, PipeTransform } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
@Pipe({
name: 'secure'
})
export class SecurePipe implements PipeTransform {
constructor(private http: HttpClient) { }
transform(url: string) {
return new Observable<string>((observer) => {
// This is a tiny blank image
observer.next('data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==');
// The next and error callbacks from the observer
const {next, error} = observer;
this.http.get(url, {responseType: 'blob'}).subscribe(response => {
const reader = new FileReader();
reader.readAsDataURL(response);
reader.onloadend = function() {
observer.next(reader.result);
};
});
return {unsubscribe() { }};
});
}
}
Vous l'utilisez comme ça :
<img [src]="'/api/image/42' | secure | async" />
Les solutions précédentes étaient très imparfaites. Je ne garantis pas que cette solution soit parfaite, mais elle a été testée et fonctionne pour moi.
Vous ne pouvez pas retourner l'observable que vous obtenez de http.get ! Je ne sais pas pourquoi les solutions précédentes supposent que vous le pouvez. L'observable pour http.get indique quand les données sont récupérées du serveur. Mais, il y a un autre processus asynchrone qui doit être complété après cela : l'appel à reader.readAsDataURL. Vous devez donc créer un Observable sur lequel vous appellerez next après la fin de ce processus.
De plus, si vous ne mettez pas immédiatement quelque chose dans l'image, le navigateur essaiera toujours de charger l'image en utilisant HTTP et vous obtiendrez une erreur dans votre console JavaScript. C'est la raison du premier appel à observer.next qui introduit une image GIF vide et minuscule.
Un problème avec cette approche est que si l'image est utilisée plus d'une fois, elle sera chargée à chaque fois. Même si le navigateur met l'image en cache, vous devez effectuer la conversion en base64 à chaque fois. J'ai créé un cache qui stocke l'image de sorte que les futures requêtes ne soient pas nécessaires après la première.