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 demuestra cómo acceder a los atributos del evento, cómo descargar un archivo a un Cloud Functions y otros aspectos básicos 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 cuando se produzcan cambios en Cloud Storage
Usa functions.storage
para crear una función que controle eventos Cloud Storage. Según si deseas definir el alcance de la función a un bucket específico de Cloud Storage o utilizar el bucket predeterminado, elige una de las siguientes opciones:
functions.storage.object()
para detectar los cambios que se produzcan en los objetos del bucket de Cloud Storage predeterminado.functions.storage.bucket('bucketName').object()
para detectar los cambios en los objetos de un bucket específico
Por ejemplo, la muestra del generador de miniaturas se limita al bucket predeterminado del proyecto:
exports.firstGenGenerateThumbnail = functions.storage.object().onFinalize(async (object) => { // ... });
Cloud Storage admite los siguientes eventos:
onArchive
: Solo se envía cuando un bucket tiene habilitado el control de versiones de objetos. Este evento señala que la versión publicada de un objeto se convirtió en una versión archivada, ya sea porque se la archivó o porque se reemplazó cuando se subió un objeto con el mismo nombre.onDelete
: Se envía cuando se borra un objeto de manera permanente. Incluye los objetos que se reemplazan o se borran según la configuración del ciclo de vida del bucket. En el caso de los buckets que tienen habilitado el control de versiones de objetos, este evento no se envía cuando se archiva un objeto (consultaonArchive
), incluso si el archivado se lleva a cabo con el métodostorage.objects.delete
.onFinalize
: Se envía cuando se crea correctamente un objeto nuevo (o una nueva generación de un objeto existente) en el bucket. Incluye la copia o la reescritura de un objeto existente. Una carga con errores no activa este evento.onMetadataUpdate
: Se envía cuando cambian los metadatos de un objeto existente.
Configura el evento dentro del controlador de evento on
como se muestra en el ejemplo anterior para onFinalize
.
Acceder a los atributos de objeto de Cloud Storage
Cloud Functions expone varios atributos de objeto de Cloud Storage como size
y contentType
del archivo actualizado. El atributo metageneration aumenta siempre que se produce un cambio en los metadatos del objeto. En el caso de los objetos nuevos, el valor de metageneration
es 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.
La muestra de generación de miniaturas utiliza algunos de estos atributos para detectar casos de salida en los que el resultado es el siguiente:
// 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.'); }
Descarga, transforma y sube un archivo
En algunos casos, tal vez 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 objetos y volver a subirlos a Cloud Storage con facilidad, instala el paquete de Google Cloud Storage con npm install --save @google-cloud/storage
y, luego, impórtalo. Para usar promesas de JavaScript para controlar procesos externos, como las tareas de procesamiento de miniaturas de la muestra, importa también child-process-promise
de la siguiente manera:
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');
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, puedes 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 imágenes
Usando Cloud Functions junto con programas de procesamiento de imágenes, como sharp
, puedes realizar manipulaciones en archivos de imagen gráfica. 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 = 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!");
Este código crea una miniatura de 200×200 píxeles de la imagen guardada en un directorio temporal y, luego, la sube a Cloud Storage.
Explora más ejemplos
Consulta más ejemplos de funciones comunes de transformación de contenido multimedia, 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.