Trigger di Cloud Storage (1ª gen.)

Puoi 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 immagine vengono caricati in Cloud Storage. Questa funzione di esempio mostra come accedere agli attributi degli eventi, come scaricare un file in un'Cloud Functions istanza e altri aspetti fondamentali della gestione degli eventi Cloud Storage.

Per altri esempi di casi d'uso, consulta Cosa posso fare con Cloud Functions?

Attivare una funzione in caso di modifiche a Cloud Storage

Utilizza functions.storage per creare una funzione che gestisca gli eventi Cloud Storage. A seconda che tu voglia limitare l'ambito della tua funzione a un bucket Cloud Storage specifico o utilizzare il bucket predefinito, utilizza una delle seguenti opzioni:

Ad esempio, l'ambito dell'esempio del generatore di miniature è limitato al bucket predefinito per il progetto:

exports.firstGenGenerateThumbnail = functions.storage.object().onFinalize(async (object) => {
  // ...
});

Cloud Storage supporta i seguenti eventi:

  • onArchive Inviato solo quando nel bucket è abilitato il controllo delle versioni degli oggetti. 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 considerate eliminazioni definitive anche la sovrascrittura o l'eliminazione di oggetti nell'ambito della configurazione del ciclo di vita del bucket lifecycle configuration. Per i bucket con controllo delle versioni degli oggetti abilitato, non viene inviato in caso di archiviazione di un oggetto (vedi onArchive), anche se l'archiviazione avviene tramite il metodo storage.objects.delete.
  • onFinalize Inviato 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 in caso di variazioni nei metadati di un oggetto esistente.

Imposta l'evento all'interno del gestore di eventi on come mostrato sopra per onFinalize.

Accedere agli attributi degli oggetti Cloud Storage

Cloud Functions espone una serie di attributi degli oggetti Cloud Storage, come size e contentType per il file aggiornato. L' attributo 'metageneration' viene incrementato ogni volta che vengono modificati i metadati dell' oggetto. Per i nuovi oggetti, il metageneration valore è 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 di 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.');
}

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 miniatura da un file archiviato in Cloud Storage, devi scaricare i file nell'istanza delle funzioni, ovvero nella macchina virtuale che esegue il codice.

Per scaricare e ricaricare facilmente gli oggetti in Cloud Storage, installa il Google Cloud Storage pacchetto utilizzando npm install --save @google-cloud/storage, e importalo. Per utilizzare le promesse JavaScript per gestire i 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 nell'istanza Cloud Functions. In questa posizione, puoi elaborare il file in base alle tue esigenze e poi caricarlo in Cloud Storage. Quando esegui attività asincrone, assicurati di restituire una promessa JavaScript nel callback.

Esempio: trasformazione delle immagini

Utilizzando Cloud Functions insieme a programmi di elaborazione delle immagini come sharp, puoi eseguire manipolazioni sui file di immagini grafiche. Di seguito è riportato un esempio di come creare un'immagine 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 una miniatura 200x200 per l'immagine salvata in una directory temporanea, quindi la ricarica in Cloud Storage.

Esplorare altri esempi

Altri esempi di funzioni di trasformazione dei contenuti multimediali comuni, tra cui la transcodifica delle immagini, la moderazione dei contenuti e l'estrazione dei metadati EXIF. L'elenco completo degli esempi è disponibile su GitHub.