Tartalomjegyzék

< Angular

Angular - Blob képek megjelenítése

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:

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

        <tr *ngFor="let emp of employees">
            <td>{{emp.id}}</td>
            <td>{{emp.name}}</td>
            <td>{{emp.city}}</td>
            <td>{{emp.salary}}</td>
            <td>
                <img [src]="b64ToUrl(emp.image)">
            </td>
        </tr>

Employee komponens

emplyee.component.ts
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;
  }
 
}
emplyee.component.html
<h1>Dolgozók</h1>
 
<table>
    <thead>
        <tr>
            <th>Id</th>
            <th>Név</th>
            <th>Település</th>
            <th>Fizetés</th>
            <th>Kép</th>
        </tr>
    </thead>
    <tbody>
        <tr *ngFor="let emp of employees">
            <td>{{emp.id}}</td>
            <td>{{emp.name}}</td>
            <td>{{emp.city}}</td>
            <td>{{emp.salary}}</td>
            <td>
                <img [src]="b64ToUrl(emp.image)">
            </td>
        </tr>
    </tbody>
 
</table>

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:

<tr *ngFor="let emp of employees">
    <td>{{emp.id}}</td>
    <td>{{emp.name}}</td>
    <td>{{emp.city}}</td>
    <td>{{emp.salary}}</td>
    <td>
        <img src={{emp.image}}>
    </td>
</tr>

Vagy:

<tr *ngFor="let emp of employees">
    <td>{{emp.id}}</td>
    <td>{{emp.name}}</td>
    <td>{{emp.city}}</td>
    <td>{{emp.salary}}</td>
    <td>
        <img [src]="emp.image">
    </td>
</tr>

Böngésző megjeleníti az src attribútumnak megadott blobot, ha előtt szerepel a MIME típus.