page change angular typescript angular2-services

change - ng-href angularjs



¿Obtener imagen de API en Angular 4/5+? (2)

Tengo nuevo para desarrollar Angular 4. Tengo problemas al obtener la respuesta de la API sobre la visualización de la imagen. En la API, un archivo de imagen tiene un archivo de flujo de entrada, no sé cómo recuperarlo y mostrarlo correctamente.

¿Alguien puede resolverlo?

Intenté esto:

  • Image.Component.ts:

    this.http.get(''http://localhost:8080/xxx/download/file/596fba76ed18aa54e4f80769'') .subscribe((response) => { var blob = new Blob([response.text()], {type: "image/png"}); console.log(blob); console.log(window.btoa(blob.toString())); });

Resultado de esto => W29iamVjdCBCbG9iXQ== , pero no era el formato correcto

y probé esto también:

this.http.get(''http://localhost:8080/xxx/download/file/596fba76ed18aa54e4f80769'').map(Image=>Image.text()) .subscribe(data => { console.log((data.toString())); });

Resultado como este =>

����/ExifII*��7 ��DuckyK��fhttp://ns.adobe.com/xap/1.0/<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.3-c011 66.145661, 2012/02/06-14:56:27 "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmpMM:OriginalDocumentID="xmp.did:0280117407206811A2188F30B3BD015B" xmpMM:DocumentID="xmp.did:E2C71E85399511E7A5719C5BBD3DDB73" xmpMM:InstanceID="xmp.iid:E2C71E84399511E7A5719C5BBD3DDB73" xmp:CreatorTool="Adobe Photoshop CC 2014 (Windows)"> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:7092a9cd-b3fd-bb49-b53c-9b6e1aa1ac93" stRef:documentID="adobe:docid:photoshop:40615934-3680-11e7-911d-f07c687d49b8"/> <dc:rights> <rdf:Alt> <rdf:li xml:lang="x-default"> </rdf:li> </rdf:Alt> </dc:rights> <dc:creator> <rdf:Seq/> </dc:creator> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="r"?>���Photoshop 3.08BIMJZ%Gt6 8BIM%�<".}��νz��܌��Adobed����

pero solía codificar usando window.btoa debería ser un error como el rango no latino


Debería establecer responseType: ResponseContentType.Blob en su configuración de solicitud GET, porque así puede obtener su imagen como blob y convertirla más tarde en una fuente codificada en base64. El código anterior no es bueno. Si desea hacer esto correctamente, cree un servicio separado para obtener imágenes de la API. Porque no es bueno llamar a HTTP-Request en componentes.

Aquí hay un ejemplo de trabajo:

Cree image.service.ts y ponga el siguiente código:

Angular 4:

getImage(imageUrl: string): Observable<File> { return this.http .get(imageUrl, { responseType: ResponseContentType.Blob }) .map((res: Response) => res.blob()); }

Angular 5+:

getImage(imageUrl: string): Observable<Blob> { return this.httpClient.get(imageUrl, { responseType: ''blob'' }); }

Importante: desde Angular 5+ deberías usar el nuevo HttpClient .

El nuevo HttpClient devuelve JSON de forma predeterminada. Si necesita otro tipo de respuesta, puede especificarlo estableciendo responseType: ''blob'' . Lea más sobre eso here .

Ahora necesita crear alguna función en su image.component.ts para obtener la imagen y mostrarla en html.

Para crear una imagen de Blob, debe usar FileReader de JavaScript. Aquí hay una función que crea un nuevo FileReader y escucha el evento de carga de FileReader. Como resultado, esta función devuelve una imagen codificada en base64, que puede usar en img src-attribute:

imageToShow: any; createImageFromBlob(image: Blob) { let reader = new FileReader(); reader.addEventListener("load", () => { this.imageToShow = reader.result; }, false); if (image) { reader.readAsDataURL(image); } }

Ahora debe usar su ImageService creado para obtener imágenes de la API. Debería suscribirse a los datos y proporcionar estos datos para createImageFromBlob ImageFromBlob. Aquí hay una función de ejemplo:

getImageFromService() { this.isImageLoading = true; this.imageService.getImage(yourImageUrl).subscribe(data => { this.createImageFromBlob(data); this.isImageLoading = false; }, error => { this.isImageLoading = false; console.log(error); }); }

Ahora puede usar su imageToShow -variable en una plantilla HTML como esta:

<img [src]="imageToShow" alt="Place image title" *ngIf="!isImageLoading; else noImageFound"> <ng-template #noImageFound> <img src="fallbackImage.png" alt="Fallbackimage"> </ng-template>

Espero que esta descripción sea clara de entender y pueda usarla en su proyecto.

Vea el ejemplo de trabajo para Angular 5+ here .


angular 5:

getImage(id: string): Observable<Blob> { return this.httpClient.get(''http://myip/image/''+id, {responseType: "blob"}); }