3
votes

Fonctions cloud: les images redimensionnées ne se chargent pas

Je suis un tutoriel pour redimensionner les images via Cloud Functions lors du téléchargement et je rencontre deux problèmes majeurs que je ne parviens pas à comprendre:

1) Si un PNG est téléchargé, il génère les vignettes correctement dimensionnées, mais leur aperçu ne se chargera pas dans Firestorage (la flèche de chargement s'affiche indéfiniment). Il ne montre l'image qu'après avoir cliqué sur "Générer un nouveau jeton d'accès" (aucune des vignettes générées n'a de jeton d'accès au départ).

2) Si un JPEG ou tout autre format est téléchargé, le type MIME s'affiche sous la forme "application / octet-stream". Je ne sais pas comment extraire correctement l'extension pour la mettre dans le nom de fichier des vignettes nouvellement générées?

export const generateThumbs = functions.storage
.object()
.onFinalize(async object => {
  const bucket = gcs.bucket(object.bucket);
  const filePath = object.name;
  const fileName = filePath.split('/').pop();
  const bucketDir = dirname(filePath);

  const workingDir = join(tmpdir(), 'thumbs');
  const tmpFilePath = join(workingDir, 'source.png');

  if (fileName.includes('thumb@') || !object.contentType.includes('image')) {
    console.log('exiting function');
    return false;
  }

  // 1. Ensure thumbnail dir exists
  await fs.ensureDir(workingDir);

 // 2. Download Source File
 await bucket.file(filePath).download({
   destination: tmpFilePath
 });

// 3. Resize the images and define an array of upload promises
 const sizes = [64, 128, 256];

 const uploadPromises = sizes.map(async size => {
  const thumbName = `thumb@${size}_${fileName}`;
  const thumbPath = join(workingDir, thumbName);

  // Resize source image
   await sharp(tmpFilePath)
    .resize(size, size)
    .toFile(thumbPath);

  // Upload to GCS
  return bucket.upload(thumbPath, {
    destination: join(bucketDir, thumbName)
  });
});

// 4. Run the upload operations
  await Promise.all(uploadPromises);

// 5. Cleanup remove the tmp/thumbs from the filesystem
  return fs.remove(workingDir);
  });

J'apprécierais grandement vos commentaires!


0 commentaires

3 Réponses :


1
votes

Je viens de commencer à utiliser l'extension moi-même. J'ai remarqué que je ne peux pas accéder à l'aperçu de l'image depuis la console Firebase tant que je n'ai pas cliqué sur "créer un jeton d'accès". Je suppose que vous devez créer ce jeton par programme avant que l'image ne soit disponible.

J'espère que ça aide


0 commentaires

7
votes

J'ai juste eu le même problème, pour une raison inconnue, Redimensionner les images de Firebase en supprimant volontairement le jeton de téléchargement de l'image redimensionnée

pour désactiver la suppression des jetons d'accès au téléchargement

  • allez à https://console.cloud.google.com
  • sélectionnez Cloud Functions à gauche
  • sélectionnez ext-storage-resize-images-generateResizedImage
  • Cliquez sur EDIT
  • à partir de l'éditeur en ligne, accédez au fichier FUNCTIONS / LIB / INDEX.JS
  • Ajouter // avant cette ligne ( supprimer metadata.metadata.firebaseStorageDownloadTokens; )
  • Commentez également la même ligne de ce fichier FUNCTIONS / SRC / INDEX.TS
  • Appuyez sur DEPLOY et attendez la fin

Remarque: l'original et le redimensionnement auront le même jeton.


4 commentaires

Cela a très bien fonctionné merci! Je me demande vraiment pourquoi ils supprimeraient les jetons pour cela ...


C'est le type de réponse que j'aime voir! Cela a fonctionné pour moi aussi, merci!


Cette ligne a été supprimée dans la version 0.1.7 de l'extension. Si vous mettez simplement à jour vers cette version (ou supérieure), votre problème sera résolu :)


@ RosárioPereiraFernandes heureux de savoir qu'ils ont finalement résolu le problème.



0
votes

Novembre 2020

En relation avec la réponse @Somebody, je n'arrive pas à trouver ext-storage-resize-images-generateResizedImage dans GCP Cloud Functions

La meilleure façon de le faire est de réutiliser firebaseStorageDownloadTokens du fichier d' firebaseStorageDownloadTokens

c'est comme ça que j'ai fait le mien

functions
    .storage
    .object()
    .onFinalize((object) => {

      // some image optimization code here
      // get the original file access token
      const downloadtoken = object.metadata?.firebaseStorageDownloadTokens;
      return bucket.upload(tempLocalFile, {
        destination: file,
          metadata: {
            metadata: {
              optimized: true, // other custom flags
              firebaseStorageDownloadTokens: downloadtoken, // access token
            }
            
      });
    });


0 commentaires