[[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.