Search docs/

Enregistrement des photos dans le système de fichiers

Contents

Nous avons implémenté la prise de photos et l'enregistrement sur le système de fichiers. Il y a une dernière fonctionnalité manquante : les photos sont stockées dans le système de fichiers, mais nous avons besoin d'un moyen d'enregistrer des pointeurs vers chaque fichier afin qu'ils puissent être affichés à nouveau dans la galerie de photos.

Heureusement, c'est facile : nous allons mettre à profit le Storage API de Capacitor pour stocker notre tableau de photos dans un tableau clé/valeur.

Storage API

Commencez par définir une variable constante qui servira de clé pour le tableau :

export class PhotoService {
  public photos : Photo[] = [];
  private PHOTO_STORAGE: string = "photos";

  // autre code
}
CopyCopied

Ensuite, à la fin de la fonction addNewToGallery , ajoutez un appel à Storage.set() pour enregistrer le tableau Photos. En l'ajoutant ici, le tableau Photos est stocké chaque fois qu'une nouvelle photo est prise. De cette façon, peu importe si l'utilisateur de l'application ferme ou passe à une autre application, toutes les données photo sont enregistrées.

Storage.set({
  key: this.PHOTO_STORAGE,
  value: JSON.stringify(this.photos)
});
CopyCopied

Avec le tableau de photos enregistré, créez une fonction appelée loadSaved() qui peut récupérer ces données. We use the same key to retrieve the photos array in JSON format, then parse it into an array:

public async loadSaved() {
  // Retrieve cached photo array data
  const photoList = await Storage.get({ key: this.PHOTO_STORAGE });
  this.photos = JSON.parse(photoList.value) || [];

  // more to come...
}
CopyCopied

On mobile (coming up next!), we can directly set the source of an image tag - <img src="x" /> - to each photo file on the Filesystem, displaying them automatically. On the web, however, we must read each image from the Filesystem into base64 format, using a new base64 property on the Photo object. This is because the Filesystem API uses IndexedDB under the hood. Below is the code you need to add in the loadSaved() function you just added:

// Display the photo by reading into base64 format
for (let photo of this.photos) {
  // Read each saved photo's data from the Filesystem
  const readFile = await Filesystem.readFile({
      path: photo.filepath,
      directory: FilesystemDirectory.Data
  });

  // Web platform only: Load the photo as base64 data
  photo.webviewPath = `data:image/jpeg;base64,${readFile.data}`;
}
CopyCopied

Ensuite, appelez cette nouvelle méthode dans l'onglet 2.page. s de sorte que lorsque l'utilisateur navigue pour la première fois à l'onglet 2 (la Galerie Photo), toutes les photos sont chargées et affichées à l'écran.

async ngOnInit() {
  await this.photoService.loadSaved();
}
CopyCopied

That’s it! Nous avons créé une fonctionnalité complète de la Galerie de photos dans notre application Ionic qui fonctionne sur le Web. Ensuite, nous le transformerons en une application mobile pour iOS et Android !

Previous
Saving Photos on Filesystem
Next
Adding Mobile