È possibile attivare una funzione in risposta al caricamento, all'aggiornamento o all'eliminazione di file e cartelle in Cloud Storage.
Gli esempi in questa pagina si basano su una funzione di esempio che si attiva quando i file di immagine vengono caricati su Cloud Storage. Questa funzione di esempio dimostra come accedere agli attributi dell'evento, come scaricare un file in un'istanza Cloud Functions e altri fondamenti della gestione degli eventi Cloud Storage.
Per ulteriori esempi di casi d'uso, consulta Cosa posso fare con Cloud Functions?
Attiva una funzione sulle modifiche di Cloud Storage
Utilizza functions.storage
per creare una funzione che gestisca gli eventi di Cloud Storage. A seconda che tu voglia estendere la tua funzione a uno specifico bucket Cloud Storage o utilizzare il bucket predefinito, utilizza uno dei seguenti:
-
functions.storage.object()
per ascoltare le modifiche agli oggetti nel bucket Cloud Storage predefinito. -
functions.storage.bucket('bucketName').object()
per ascoltare le modifiche agli oggetti su un bucket specifico.
Ad esempio, l'esempio del generatore di miniature ha come ambito il bucket predefinito per il progetto:
exports.firstGenGenerateThumbnail = functions.storage.object().onFinalize(async (object) => { // ... });
Cloud Storage supporta questi eventi:
-
onArchive
Inviato solo quando un bucket ha abilitato il controllo delle versioni dell'oggetto . Questo evento indica che la versione live di un oggetto è diventata una versione archiviata, perché è stata archiviata o perché è stata sovrascritta dal caricamento di un oggetto con lo stesso nome. -
onDelete
Inviato quando un oggetto è stato eliminato definitivamente. Ciò include gli oggetti che vengono sovrascritti o eliminati come parte della configurazione del ciclo di vita del bucket. Per i bucket con il controllo delle versioni degli oggetti abilitato, questo non viene inviato quando un oggetto viene archiviato (vedereonArchive
), anche se l'archiviazione avviene tramite il metodostorage.objects.delete
. -
onFinalize
Inviato quando un nuovo oggetto (o una nuova generazione di un oggetto esistente) viene creato con successo nel bucket. Ciò include la copia o la riscrittura di un oggetto esistente. Un caricamento non riuscito non attiva questo evento. -
onMetadataUpdate
Inviato quando i metadati di un oggetto esistente cambiano.
Imposta l'evento all'interno del gestore eventi on
come mostrato sopra per onFinalize
.
Accedi agli attributi dell'oggetto Cloud Storage
Cloud Functions espone una serie di attributi dell'oggetto Cloud Storage come size
e contentType
per il file aggiornato. L'attributo 'metagenerazione' viene incrementato ogni volta che viene apportata una modifica ai metadati dell'oggetto. Per i nuovi oggetti, il valore metageneration
è 1
.
const fileBucket = object.bucket; // The Storage bucket that contains the file. const filePath = object.name; // File path in the bucket. const contentType = object.contentType; // File content type.
L'esempio di generazione delle miniature utilizza alcuni di questi attributi per rilevare i casi di uscita in cui la funzione restituisce:
// Exit if this is triggered on a file that is not an image. if (!contentType.startsWith('image/')) { return functions.logger.log('This is not an image.'); } // Get the file name. const fileName = path.basename(filePath); // Exit if the image is already a thumbnail. if (fileName.startsWith('thumb_')) { return functions.logger.log('Already a Thumbnail.'); }
Scarica, trasforma e carica un file
In alcuni casi potrebbe non essere necessario scaricare file da Cloud Storage. Tuttavia, per eseguire attività impegnative come la generazione di un'immagine in miniatura da un file archiviato in Cloud Storage, è necessario scaricare i file nell'istanza delle funzioni, ovvero la macchina virtuale che esegue il codice.
Per scaricare e ricaricare facilmente gli oggetti su Cloud Storage, installa il pacchetto Google Cloud Storage utilizzando npm install --save @google-cloud/storage
e importalo. Per utilizzare le promesse JavaScript per gestire processi esterni come le attività di elaborazione delle miniature nell'esempio, importa anche child-process-promise
:
const functions = require('firebase-functions/v1'); const admin = require('firebase-admin'); admin.initializeApp() const path = require('path'); //library for resizing images const sharp = require('sharp');
Utilizza gcs.bucket.file(filePath).download
per scaricare un file in una directory temporanea sull'istanza Cloud Functions. In questa posizione è possibile elaborare il file secondo necessità e quindi caricarlo su Cloud Storage. Quando esegui attività asincrone, assicurati di restituire una promessa JavaScript nella richiamata.
Esempio: trasformazione dell'immagine
Utilizzando Cloud Functions insieme a programmi di elaborazione delle immagini come sharp
, è possibile eseguire manipolazioni su file di immagini grafiche. Di seguito è riportato un esempio di come creare un'immagine in miniatura per un file di immagine caricato:
// Download file from bucket. const bucket = admin.storage().bucket(fileBucket); const metadata = { contentType: contentType, }; const downloadResponse = await bucket.file(filePath).download(); const imageBuffer = downloadResponse[0]; functions.logger.log("Image downloaded!"); // Generate a thumbnail using sharp. const thumbnailBuffer = await sharp(imageBuffer).resize({ width: 200, height: 200, withoutEnlargement: true, }).toBuffer(); functions.logger.log("Thumbnail created"); // Upload the thumbnail with a 'thumb_' prefix. const thumbFileName = `thumb_${fileName}`; const thumbFilePath = path.join(path.dirname(filePath), thumbFileName); await bucket.file(thumbFilePath).save(thumbnailBuffer, { metadata: metadata, }); return functions.logger.log("Thumbnail uploaded!");
Questo codice crea una miniatura 200x200 per l'immagine salvata in una directory temporanea, quindi la carica nuovamente su Cloud Storage.
Esplora altri esempi
Altri esempi di funzioni comuni di trasformazione dei media, tra cui la transcodifica delle immagini , la moderazione dei contenuti e l'estrazione dei metadati EXIF . L' elenco completo degli esempi è disponibile su GitHub.