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!
3 Réponses :
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
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
Remarque: l'original et le redimensionnement auront le même jeton.
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.
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 } }); });