获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

Activadores de almacenamiento en la nube

Puede 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 muestra que se activa cuando los archivos de imagen se cargan en Cloud Storage. Esta función de muestra muestra cómo acceder a los atributos de los eventos, cómo descargar un archivo a una instancia de Cloud Functions y otros aspectos básicos del manejo de eventos de Cloud Storage.

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

Activar una función en los cambios de almacenamiento en la nube

Usa functions.storage para crear una función que maneje los eventos de Cloud Storage. Dependiendo de si desea limitar su función a un depósito de Cloud Storage específico o usar el depósito predeterminado, use uno de los siguientes:

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

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

Cloud Storage admite estos eventos:

  • onArchive Solo se envía cuando un depósito ha habilitado el control de versiones de objetos . Este evento indica que la versión en vivo de un objeto se ha convertido en una versión archivada, ya sea porque se archivó o porque se sobrescribió con la carga de un objeto con el mismo nombre.
  • onDelete Enviado cuando un objeto ha sido eliminado permanentemente. Esto incluye objetos que se sobrescriben o se eliminan como parte de la configuración del ciclo de vida del depósito. Para depósitos con el control de versiones de objetos habilitado, esto no se envía cuando se archiva un objeto (consulte onArchive ), incluso si el archivado se realiza a través del método storage.objects.delete .
  • onFinalize Enviado cuando un nuevo objeto (o una nueva generación de un objeto existente) se crea correctamente en el depósito. Esto incluye copiar o reescribir un objeto existente. Una carga fallida no desencadena este evento.
  • onMetadataUpdate Enviado cuando cambian los metadatos de un objeto existente.

Configure el evento dentro del controlador de eventos on como se muestra arriba para onFinalize .

Acceder a atributos de objetos de Cloud Storage

Cloud Functions expone una cantidad de atributos de objetos de Cloud Storage, como el size y el tipo de contentType para el archivo actualizado. El atributo 'metageneración' se incrementa cada vez que hay un cambio en los metadatos del objeto. Para 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.
const metageneration = object.metageneration; // Number of times metadata has been generated. New objects have a value of 1.

El ejemplo de generación de miniaturas utiliza algunos de estos atributos para detectar casos de salida en los que la función devuelve:

// 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.');
}

Descargar, transformar y cargar un archivo

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

Para descargar y volver a cargar fácilmente objetos en Cloud Storage, instale el paquete de Google Cloud Storage mediante npm install --save @google-cloud/storage e impórtelo. Para usar promesas de JavaScript para manejar procesos externos como las tareas de procesamiento de miniaturas en la muestra, también importa child-process-promise :

const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp()
const spawn = require('child-process-promise').spawn;
const path = require('path');
const os = require('os');
const fs = require('fs');

Use gcs.bucket.file(filePath).download para descargar un archivo a un directorio temporal en su instancia de Cloud Functions. En esta ubicación, puede procesar el archivo según sea necesario y luego cargarlo en Cloud Storage. Al realizar tareas asincrónicas, asegúrese de devolver una promesa de JavaScript en su devolución de llamada.

Ejemplo: transformación de imagen

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

// Download file from bucket.
const bucket = admin.storage().bucket(fileBucket);
const tempFilePath = path.join(os.tmpdir(), fileName);
const metadata = {
  contentType: contentType,
};
await bucket.file(filePath).download({destination: tempFilePath});
functions.logger.log('Image downloaded locally to', tempFilePath);
// Generate a thumbnail using ImageMagick.
await spawn('convert', [tempFilePath, '-thumbnail', '200x200>', tempFilePath]);
functions.logger.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.
await bucket.upload(tempFilePath, {
  destination: thumbFilePath,
  metadata: metadata,
});
// Once the thumbnail has been uploaded delete the local file to free up disk space.
return fs.unlinkSync(tempFilePath);

Este código ejecuta el programa de línea de comandos ImageMagick convert para crear una miniatura de 200x200 para la imagen guardada en un directorio temporal y luego la vuelve a cargar en Cloud Storage.

Explora más ejemplos

Más ejemplos de funciones comunes de transformación de medios, incluida 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.

Consulte la documentación completa del disparador de Google Cloud Storage para obtener más información.