Acionadores do Cloud Storage


Você pode acionar uma função em resposta ao upload, atualização ou exclusão de arquivos e pastas no Cloud Storage.

Os exemplos nesta página são baseados em uma função de amostra que é acionada quando os arquivos de imagem são enviados para o Cloud Storage. Este exemplo de função demonstra como acessar atributos de eventos, como fazer download de um arquivo para uma instância do Cloud Functions e outros princípios básicos do tratamento de eventos do Cloud Storage.

Para ver mais exemplos de casos de uso, consulte O que posso fazer com o Cloud Functions?

Acionar uma função nas alterações do Cloud Storage

Use functions.storage para criar uma função que processe eventos do Cloud Storage. Dependendo se você deseja definir o escopo da função para um bucket específico do Cloud Storage ou usar o bucket padrão, use um dos seguintes:

Por exemplo, o exemplo do gerador de miniaturas tem como escopo o bucket padrão do projeto:

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

O Cloud Storage oferece suporte a estes eventos:

  • onArchive Enviado somente quando um bucket habilitou o versionamento de objetos . Este evento indica que a versão ativa de um objeto se tornou uma versão arquivada, seja porque foi arquivada ou porque foi substituída pelo upload de um objeto de mesmo nome.
  • onDelete Enviado quando um objeto foi excluído permanentemente. Isso inclui objetos que são substituídos ou excluídos como parte da configuração do ciclo de vida do bucket . Para buckets com controle de versão de objeto habilitado, isso não é enviado quando um objeto é arquivado (consulte onArchive ), mesmo que o arquivamento ocorra por meio do método storage.objects.delete .
  • onFinalize Enviado quando um novo objeto (ou uma nova geração de um objeto existente) é criado com sucesso no bucket. Isto inclui copiar ou reescrever um objeto existente. Um upload com falha não aciona esse evento.
  • onMetadataUpdate Enviado quando os metadados de um objeto existente são alterados.

Defina o evento on manipulador de eventos on conforme mostrado acima para onFinalize .

Acessar atributos de objetos do Cloud Storage

O Cloud Functions expõe vários atributos de objeto do Cloud Storage, como size e contentType para o arquivo atualizado. O atributo 'metageração' é incrementado sempre que há uma alteração nos metadados do objeto. Para novos objetos, o valor 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.

O exemplo de geração de miniaturas usa alguns destes atributos para detectar casos de saída nos quais a função retorna:

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

Baixe, transforme e carregue um arquivo

Em alguns casos, pode não ser necessário baixar arquivos do Cloud Storage. No entanto, para realizar tarefas intensivas, como gerar uma imagem em miniatura de um arquivo armazenado no Cloud Storage, você precisa fazer download dos arquivos para a instância de funções, ou seja, a máquina virtual que executa seu código.

Para fazer download e fazer upload novamente de objetos para o Cloud Storage com facilidade, instale o pacote do Google Cloud Storage usando npm install --save @google-cloud/storage e importe-o. Para usar promessas JavaScript para lidar com processos externos, como as tarefas de processamento de miniaturas no exemplo, importe também 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');

Use gcs.bucket.file(filePath).download para fazer download de um arquivo em um diretório temporário na instância do Cloud Functions. Nesse local, você pode processar o arquivo conforme necessário e depois fazer upload para o Cloud Storage. Ao executar tarefas assíncronas, certifique-se de retornar uma promessa JavaScript em seu retorno de chamada.

Exemplo: transformação de imagem

Usando o Cloud Functions junto com programas de processamento de imagens como sharp , você pode realizar manipulações em arquivos de imagens gráficas. A seguir está um exemplo de como criar uma imagem em miniatura para um arquivo de imagem carregado:

// 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!");

Esse código cria uma miniatura de 200 x 200 para a imagem salva em um diretório temporário e depois faz upload dela de volta para o Cloud Storage.

Explorar mais exemplos

Mais exemplos de funções comuns de transformação de mídia, incluindo transcodificação de imagens , moderação de conteúdo e extração de metadados EXIF . A lista completa de exemplos está disponível no GitHub.