错误从Cloud Functions覆盖Cloud Storage中调整大小的图像

时间:2019-11-25 08:15:18

标签: flutter google-cloud-functions google-cloud-storage

当前情况

我正在将个人资料图片存储在我的云存储中。每当有人添加/更新时,我都想对它进行调整大小。 因此,在我的云函数中,我添加了此触发器:

import { Storage } from '@google-cloud/storage';
import * as functions from 'firebase-functions';
import * as fs from 'fs-extra';
import { tmpdir } from 'os';
import { dirname, join } from 'path';
import * as sharp from 'sharp';


const gcs = new Storage();

//Thumb will not override previous thumb.

export const generateThumbs = functions.region('europe-west1')
  .storage
  .object()
  .onFinalize(async object => {
    const bucket = gcs.bucket(object.bucket);


    const filePath = object.name;
    if (filePath) {
      const fileName = filePath.split('/').pop();
      if (fileName) {
        const bucketDir = dirname(filePath);

        const workingDir = join(tmpdir(), 'thumbs', Date.now().toString());
        const tmpFilePath = join(workingDir, fileName);

        if (fileName.includes('thumb@') || (object.contentType && !object.contentType.includes('image'))) {
          console.log('exiting function: ' + fileName);
          return false;
        }
        await fs.ensureDir(workingDir);

        await bucket.file(filePath).download({
          destination: tmpFilePath
        });

        const sizes = [256];

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


          await sharp(tmpFilePath)
            .resize(size, size)
            .toFile(thumbPath);

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


        await Promise.all(uploadPromises);

        return fs.remove(workingDir).then(() => {
          return fs.remove(bucketDir);
        })
      }
    }
    return null;
  });

每个用户只有1张个人资料图片,而我不需要保留以前的个人资料图片,因此,例如,用户ID = 25,我上传了他的图像,其文件名为'25 .jpeg',即缩略图图像' thumb_256_25.jpeg”已正确创建。

问题

现在,用户更改了图像,我用新图像覆盖了先前的“ 25.jpeg”(这可以按预期工作),并且我的云函数触发器运行。确实在“ thumb_256_25.jpeg”上上传了新的缩略图。新上传的拇指很少是新上传的25.jpeg图像的实际缩略图。通常,它要么是前一个重新上载的,要么是更旧的。

1 个答案:

答案 0 :(得分:0)

调试真的很困难,但是我发现唯一可行的可行解决方案是为workingDir赋予一个唯一的Folder-name,如下所示:

const workingDir = join(tmpdir(), 'thumbs', Date.now().toString());

我已经尝试使用fs.remove和fs.unlink做几件事,但是这些都不起作用。对我来说,问题是该函数运行后无法正确删除workingDir以及因此的thumbPath甚至tmpFilePath文件。因此,在下一次运行时,Sharp要么正在调整tmpFilePath中存在的旧图像的大小,要么正在调整新下载的图像的大小,但是上载一个旧的图像。尽管很奇怪,因为我在函数末尾删除了该文件夹。

如果有人有解释或其他解决方案,请与他人分享。