Puoi attivare una funzione in risposta al caricamento, all'aggiornamento eliminazione di file e cartelle in Cloud Storage.
Gli esempi in questa pagina sono basati su una funzione di esempio che si attiva quando l'immagine file caricati in Cloud Storage. Questa funzione di esempio mostra come accedere agli attributi degli eventi, come scaricare un file in un'istanza Cloud Functions e altri aspetti fondamentali della gestione degli eventi Cloud Storage.
Per altri esempi di casi d'uso, vedi Che cosa posso fare con Cloud Functions?
Attiva una funzione al cambio di Cloud Storage
Utilizza functions.storage
per creare una funzione che gestisca
Cloud Storage eventi. A seconda che tu voglia limitare l'ambito della funzione a un bucket Cloud Storage specifico o utilizzare il bucket predefinito, utilizza una delle seguenti opzioni:
functions.storage.object()
per rimanere in ascolto delle modifiche agli oggetti nel bucket Cloud Storage predefinito.functions.storage.bucket('bucketName').object()
per rimanere in ascolto delle modifiche agli oggetti in un bucket specifico.
Ad esempio, l'esempio del generatore di miniature ha come ambito il bucket predefinito per del progetto:
exports.firstGenGenerateThumbnail = functions.storage.object().onFinalize(async (object) => { // ... });
Cloud Storage supporta i seguenti eventi:
onArchive
Inviato solo quando è abilitato il controllo delle versioni degli oggetti nel bucket. Questo evento indica che la versione live di un oggetto è diventata una versione archiviata, o perché è stata archiviata o perché è stata sovrascritta dal caricamento di un oggetto con lo stesso nome.onDelete
Inviato quando un oggetto è stato eliminato definitivamente. Sono inclusi gli oggetti che vengono sovrascritti o eliminati nell'ambito della configurazione del ciclo di vita del bucket. Per i bucket in cui è abilitato il controllo delle versioni degli oggetti, questo non viene inviato quando un oggetto viene archiviato (vedionArchive
), anche se l'archiviazione avviene tramite il metodostorage.objects.delete
.onFinalize
Inviata in caso di corretta creazione di un nuovo oggetto (o di nuova generazione di un oggetto esistente) nel bucket. Sono considerate creazioni anche la copia o la riscrittura di un oggetto esistente. Questo evento non viene attivato da un caricamento non riuscito.onMetadataUpdate
Inviato quando vengono modificati i metadati di un oggetto esistente.
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
come
size
:
e
contentType
per il file aggiornato. L'attributo
'metageneration'
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 l'uscita casi 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.'); }
Scaricare, trasformare e caricare un file
In alcuni casi, potrebbe non essere necessario scaricare i file da Cloud Storage. Tuttavia, per eseguire attività intensive come la generazione di un immagine in miniatura da un file archiviato in Cloud Storage, devi scaricare i file all'istanza Functions, ovvero la macchina virtuale che esegue il tuo codice.
Per scaricare e ricaricare facilmente gli oggetti su Cloud Storage, installa
Google Cloud Storage
pacchetto utilizzando
npm install --save @google-cloud/storage
e importalo. Per utilizzare JavaScript
promette di gestire processi esterni come le attività di elaborazione delle miniature
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 su un
sulla tua istanza Cloud Functions. In questa posizione, puoi elaborare il file in base alle tue esigenze e poi caricarlo su Cloud Storage. Quando
esegui attività asincrone, assicurati di restituire una promessa JavaScript nel
metodo di callback.
Esempio: trasformazione dell'immagine
Utilizzo di Cloud Functions insieme a programmi di elaborazione delle immagini come
sharp
, puoi eseguire
manipolazioni sui file di immagine grafica. Di seguito è riportato un esempio di come
crea un'immagine in miniatura per un file 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 un'immagine in miniatura di 200 x 200 per l'immagine salvata in una directory temporanea, quindi la ricarica su Cloud Storage.
Esplora altri esempi
Altri esempi di funzioni comuni di trasformazione dei media, tra cui transcodifica di immagini, moderare i contenuti, l'estrazione dei metadati EXIF. L'elenco completo di esempi è disponibili su GitHub.