云功能:调整大小的图像无法加载

时间:2019-11-27 14:53:48

标签: node.js google-cloud-functions firebase-storage

我正在跟踪tutorial,以便在上传时通过Cloud Functions调整图像大小,并且遇到了两个我无法弄清的主要问题:

1)如果上传了PNG,它将生成正确大小的缩略图,但不会在Firestorage中加载它们的预览(“加载”微调框将无限期显示)。它仅在我单击“生成新的访问令牌”后显示图像(最初生成的缩略图都没有访问令牌)。

2)如果上载JPEG或任何其他格式,则MIME类型显示为“ application / octet-stream”。我不确定如何正确提取扩展名以放入新生成的缩略图的文件名中?

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 (fileName.includes('thumb@') || !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);
  });

非常感谢您的反馈!

3 个答案:

答案 0 :(得分:7)

我只是遇到了同样的问题,由于未知原因,Firebase的“调整大小图像”故意从调整大小后的图像中删除了下载令牌

禁止删除下载访问令牌

  • 转到https://console.cloud.google.com
  • 从左侧
  • 选择云功能
  • 选择 ext-storage-resize-images-generateResizedImage
  • 点击 EDIT
  • 从Inline编辑器转到文件 FUNCTIONS / LIB / INDEX.JS
  • 在此行之前添加//(删除metadata.metadata.firebaseStorageDownloadTokens;
  • 也对此文件的同一行进行注释 FUNCTIONS / SRC / INDEX.TS
  • DEPLOY ,然后等待完成

注意:原始尺寸和调整后的尺寸将具有相同的令牌。

答案 1 :(得分:1)

我刚刚开始使用扩展程序。我注意到,在单击“创建访问令牌”之前,无法从Firebase控制台访问图像预览。 我想您必须在可用图像之前以编程方式创建此令牌。

我希望对您有帮助

答案 2 :(得分:0)

2020年11月

关于@Somebody答案,我似乎在GCP Cloud Functions

中找不到 ext-storage-resize-images-generateResizedImage

更好的方法是重用原始文件的firebaseStorageDownloadTokens

这就是我的方式

functions
    .storage
    .object()
    .onFinalize((object) => {

      // some image optimization code here
      // get the original file access token
      const downloadtoken = object.metadata?.firebaseStorageDownloadTokens;
      return bucket.upload(tempLocalFile, {
        destination: file,
          metadata: {
            metadata: {
              optimized: true, // other custom flags
              firebaseStorageDownloadTokens: downloadtoken, // access token
            }
            
      });
    });