[[oktatas:web:angular|< Angular]] ====== Angular - Blob képek megjelenítése ====== * **Szerző:** Sallai András * Copyright (c) Sallai András, 2023 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC Attribution-Share Alike 4.0 International]] * Web: https://szit.hu ===== Adatbázisban tárolt képek ===== Ha képeket adatbázisban tároljuk azt bináris formátumban, blobként tesszük. Ha egy REST API-ból kapunk egy ilyen adatot azt Base64 kódolva kapjuk meg. A képek tárolhatók: * blobként magukban Base64 kódolva * blobként Base64 kódolva, MIME típus megadásával ===== Csak kép van tárolva ===== Szükségünk van egy vissza-kódólra, ami a Base64 kódolt képet átalakítja szimpla Blob formátumba. A Blobból blobUrl-t készítünk, a blobUrl-t Angularban biztonságossá kell tenni dinamikus tartalom beillesztésére. ==== DomSanitizer ==== import { DomSanitizer } from '@angular/platform-browser'; //... constructor(private sanitizer: DomSanitizer) { } //... let url = this.sanitizer.bypassSecurityTrustUrl(blobUrl); ==== Base64 vissza-kódoló ==== Írhatunk sajátot. base64ToBlob(image: string) { let binaryImg = atob(image); let length = binaryImg.length; let ab = new ArrayBuffer(length); let ua = new Uint8Array(ab); for (var i = 0; i < length; i++) { ua[i] = binaryImg.charCodeAt(i); } let blobImg = new Blob([ab], { type: 'image/png' }); return blobImg; } Ezt át kell alakítani URL-re: let blobUrl = URL.createObjectURL(blobImg); JavaScriptben már használható, de Angularban még biztonságossá kell tenni: let url = this.sanitizer.bypassSecurityTrustUrl(blobUrl); A következő függvényben már be van építve az URL konvertálás is: base64ToUrl(image: string) { let binaryImg = atob(image); let length = binaryImg.length; let ab = new ArrayBuffer(length); let ua = new Uint8Array(ab); for (var i = 0; i < length; i++) { ua[i] = binaryImg.charCodeAt(i); } let blobImg = new Blob([ab], { type: 'image/png' }); let blobUrl = URL.createObjectURL(blobImg); let url = this.sanitizer.bypassSecurityTrustUrl(blobUrl); return url; } ==== Base64 kódoló npm csomagból ==== npm install --save-dev blob-util Használat: import { base64StringToBlob } from 'blob-util'; //... let blobImg = base64StringToBlob(data, 'image/png'); A data, amit REST API szervertől kaptunk. import { base64StringToBlob } from 'blob-util'; //... b64ToUrl(data: string) { let blobImg = base64StringToBlob(data, 'image/png'); let blobUrl = URL.createObjectURL(blobImg); let url = this.sanitizer.bypassSecurityTrustUrl(blobUrl); return url; } ==== HTML sablon ==== {{emp.id}} {{emp.name}} {{emp.city}} {{emp.salary}} ==== Employee komponens ==== import { Component, OnInit } from '@angular/core'; import { ApiService } from '../shared/api.service'; import { base64StringToBlob } from 'blob-util'; import { DomSanitizer } from '@angular/platform-browser'; @Component({ selector: 'app-employee', templateUrl: './employee.component.html', styleUrls: ['./employee.component.scss'] }) export class EmployeeComponent implements OnInit { employees: any; constructor( private api: ApiService, private sanitizer: DomSanitizer ) { } ngOnInit(): void { this.getEmployees(); } getEmployees() { this.api.getEmployees().subscribe({ next: data => { this.employees = data; }, error: err => {} }) } b64ToUrl(data: string) { let blobImg = base64StringToBlob(data, 'image/png'); let blobUrl = URL.createObjectURL(blobImg); let url = this.sanitizer.bypassSecurityTrustUrl(blobUrl); return url; } }

Dolgozók

Id Név Település Fizetés Kép
{{emp.id}} {{emp.name}} {{emp.city}} {{emp.salary}}
===== MIME típussal tárol kép megjelenítése ===== Nincs szükség semmilyen konvertálásra. A Blobban a MIME típus bejegyzés, például ilyen lehet: data:image/png;base64,iVCARw0KC... Csak egyszerűen: {{emp.id}} {{emp.name}} {{emp.city}} {{emp.salary}} Vagy: {{emp.id}} {{emp.name}} {{emp.city}} {{emp.salary}} Böngésző megjeleníti az src attribútumnak megadott blobot, ha előtt szerepel a MIME típus.