Activadores de Cloud Storage

Puedes activar una función en respuesta a la carga, actualización o eliminación de archivos y carpetas en Cloud Storage.

Los ejemplos de esta página se basan en una función de ejemplo que se activa cuando los archivos de imagen se suben a Cloud Storage. Esta función de ejemplo muestra cómo acceder a atributos de eventos, cómo descargar un archivo a una instancia de Cloud Functions y otros aspectos fundamentales del control de eventos de Cloud Storage.

Para ver más ejemplos de casos de uso, consulta ¿Qué puedo hacer con Cloud Functions?

Activa una función en los cambios de Cloud Storage

Usa functions.storage para crear una función que controle los eventos de Cloud Storage. Según si deseas definir el alcance de la función para un depósito específico de Cloud Storage o utilizar el depósito predeterminado, usa una de las siguientes opciones:

Por ejemplo, la muestra del generador de miniaturas se limita al depósito predeterminado para el proyecto:

exports.generateThumbnail = functions.storage.object().onChange(event => {
  // ...
});

Cloud Storage admite el evento change. Este evento se activa cada vez que cambia un objeto dentro de tu depósito de GCS (por ejemplo, cuando se crea, modifica o borra un objeto). Configura el evento change dentro del controlador de evento on como se muestra en el ejemplo anterior.

Detecta resourceState y otros atributos de eventos

Cloud Functions expone varios atributos de evento, como timestamp y resource para el cambio, y size y contentType para el archivo actualizado. El atributo resourceState de un evento tiene el valor "exists" (para la creación y la actualización de objetos) o "not_exists" (para la eliminación y el movimiento de objetos). El atributo resourceState debe sincronizarse con el atributo 'metageneration' para saber si un objeto acaba de crearse. El atributo metageneration aumenta siempre que se produce un cambio en los metadatos del objeto. En los objetos nuevos, el valor de metageneration es 1.

const object = event.data; // The Storage object.

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.
const resourceState = object.resourceState; // The resourceState is 'exists' or 'not_exists' (for file/folder deletions).
const metageneration = object.metageneration; // Number of times metadata has been generated. New objects have a value of 1.

La muestra de generación de miniaturas utiliza algunos de estos atributos para detectar casos de salida en los que se muestra la función, incluidos los eventos de eliminación:

// Exit if this is triggered on a file that is not an image.
if (!contentType.startsWith('image/')) {
  console.log('This is not an image.');
  return;
}

// Get the file name.
const fileName = path.basename(filePath);
// Exit if the image is already a thumbnail.
if (fileName.startsWith('thumb_')) {
  console.log('Already a Thumbnail.');
  return;
}

// Exit if this is a move or deletion event.
if (resourceState === 'not_exists') {
  console.log('This is a deletion event.');
  return;
}

// Exit if file exists but is not new and is only being triggered
// because of a metadata change.
if (resourceState === 'exists' && metageneration > 1) {
  console.log('This is a metadata change event.');
  return;
}

Descarga, transforma y sube un archivo

En algunos casos, es posible que no sea necesario descargar archivos desde Cloud Storage. Sin embargo, para realizar tareas intensivas, como generar una imagen en miniatura desde un archivo almacenado en Cloud Storage, debes descargar archivos en la instancia de las funciones, es decir, en la máquina virtual que ejecuta el código.

Para descargar y volver a subir objetos con facilidad en Cloud Storage, instala el paquete de Google Cloud Storage mediante npm install --save @google-cloud/storage y luego impórtalo. Para usar promesas de JavaScript a fin de controlar procesos externos, como las tareas de procesamiento de miniaturas del ejemplo, importa también child-process-promise:

const functions = require('firebase-functions');
const gcs = require('@google-cloud/storage')();
const spawn = require('child-process-promise').spawn;
const path = require('path');
const os = require('os');
const fs = require('fs');

Usa gcs.bucket.file(filePath).download para descargar un archivo en un directorio temporal en tu instancia de Cloud Functions. En esta ubicación, puedes procesar el archivo según sea necesario y luego subirlo a Cloud Storage. Cuando ejecutes tareas asíncronas, asegúrate de mostrar una promesa de JavaScript en tu devolución de llamada.

Ejemplo: Transformación de la imagen

Cloud Functions proporciona un programa de procesamiento de imágenes llamado ImageMagick que puede manipular archivos de imágenes gráficas. El siguiente es un ejemplo de cómo crear una imagen en miniatura para un archivo de imagen subido:

// Download file from bucket.
const bucket = gcs.bucket(fileBucket);
const tempFilePath = path.join(os.tmpdir(), fileName);
return bucket.file(filePath).download({
  destination: tempFilePath
}).then(() => {
  console.log('Image downloaded locally to', tempFilePath);
  // Generate a thumbnail using ImageMagick.
  return spawn('convert', [tempFilePath, '-thumbnail', '200x200>', tempFilePath]);
}).then(() => {
  console.log('Thumbnail created at', tempFilePath);
  // We add a 'thumb_' prefix to thumbnails file name. That's where we'll upload the thumbnail.
  const thumbFileName = `thumb_${fileName}`;
  const thumbFilePath = path.join(path.dirname(filePath), thumbFileName);
  // Uploading the thumbnail.
  return bucket.upload(tempFilePath, {destination: thumbFilePath});
// Once the thumbnail has been uploaded delete the local file to free up disk space.
}).then(() => fs.unlinkSync(tempFilePath));

Este código ejecuta el programa de línea de comandos ImageMagick de convert para crear una miniatura de 200 x 200 de la imagen guardada en un directorio temporal y después la sube a Cloud Storage.

Explora más ejemplos

Consulta más ejemplos de funciones comunes de transformación de medios, como la transcodificación de imágenes, la moderación de contenido y la extracción de metadatos EXIF. La lista completa de ejemplos está disponible en GitHub.

Consulta toda la documentación de los activadores de Google Cloud Storage para obtener más información.

Enviar comentarios sobre…

¿Necesitas ayuda? Visita nuestra página de asistencia.