Проверьте, существует ли изображение в хранилище с помощью облачной функции Firebase - PullRequest
0 голосов
/ 23 декабря 2018

Мне нужна ваша помощь с одной функцией, которую я создал для управления изображениями, которые мои пользователи отправляют в мое приложение.

Мне нужно получить изображение, отправленное пользователем, изменить его размер и проверить, было ли изображениеизменено, чтобы избежать функции, чтобы сделать все снова.Примеры, которые я видел, изменяют имя изображения и проверяют, совпадает ли начальное имя с установленным именем, но в моем случае мне нужно сохранить исходное имя изображения. Итак, как я могу это сделать?Или существует лучший способ решить эту проблему?Мой код функции:

  import * as functions from 'firebase-functions';

  import * as Storage from '@google-cloud/storage';
  const gcs = new Storage();

  import { tmpdir } from 'os';
  import { join, dirname } from 'path';

  import * as sharp from 'sharp';
  import * as fs from 'fs-extra';

  export const generateThumbs = functions.storage
  .object()
  .onFinalize(async object => {
    const bucket = gcs.bucket(object.bucket);
    const filePath = object.name;
    const fileName = filePath.split('/').pop();
    const bucketDir = dirname(filePath);

    const workingDir = join(tmpdir(), 'thumbs');
    const tmpFilePath = join(workingDir, 'source.png');

    if (!object.contentType.includes('image')) {
      console.log('exiting function');
      return false;
    }

    // 1. Ensure thumbnail dir exists
    await fs.ensureDir(workingDir);

    // 2. Download Source File
    await bucket.file(filePath).download({
      destination: tmpFilePath
    });

    // 3. Resize the images and define an array of upload promises
    const sizes = [64, 128, 256];

    const uploadPromises = sizes.map(async size => {
      const thumbName = `thumb@${size}_${fileName}`;
      const thumbPath = join(workingDir, thumbName);

      // Resize source image
      await sharp(tmpFilePath)
        .resize(size, size)
        .toFile(thumbPath);

      // Upload to GCS
      return bucket.upload(thumbPath, {
        destination: join(bucketDir, thumbName)
      });
    });

    // 4. Run the upload operations
    await Promise.all(uploadPromises);

    // 5. Cleanup remove the tmp/thumbs from the filesystem
    return fs.remove(workingDir);
  });

1 Ответ

0 голосов
/ 23 декабря 2018

Если вам нужно перезаписать исходный файл, и вы хотите избежать бесконечного цикла с помощью этой функции, вы можете прикрепить пользовательские метаданные к файлу при загрузке его обратно в облачное хранилище.Затем, когда функция снова вызывается для этого файла, вы можете проверить метаданные на входящем объекте ObjectMetadata , чтобы узнать, когда функция должна выйти из строя без внесения каких-либо изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...