You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Cloud Function的onFinalize中获取getDownloadURL?

如何在Cloud Storage的onFinalize函数中获取getDownloadURL?

我正在开发一个支持用户上传图片的网站。用户上传图片时会触发onFinalize函数,该函数会创建包含图片URL等信息的文档。在使用Cloud Function之前,我在客户端通过getDownloadURL获取图片URL并保存到文档中,但现在使用Cloud Function时,我只能通过图片元数据的mediaLink作为图片URL,发现其效果与getDownloadURL不一致。

当前使用的函数如下:

exports.imageFirestoreCreate = functions.storage
  .bucket()
  .object()
  .onFinalize(async (object) => {
    console.log(object);
    if (
      object.contentType.startsWith("image/") &&
      object.name.startsWith("images/")
    ) {
      const uploadDate = object.timeCreated;
      const imageLink = object.mediaLink;

      const images = firestore.collection("images");

      return images.add({
        imageURL: imageLink,
        createdAt: uploadDate,
      });
    } else {
      return null;
    }
  });

请问是否可以在onFinalize中获取getDownloadURL?


当然可以在onFinalize函数中获取等效于getDownloadURL的访问链接。mediaLink是Cloud Storage的API内部访问链接,需要携带授权信息才能访问;而客户端的getDownloadURL生成的是带签名的公开访问URL,这就是两者效果不同的核心原因。

在Cloud Function中,你可以通过获取对应文件对象并调用getSignedUrl方法来生成和getDownloadURL效果一致的链接,具体修改后的代码如下:

const { Storage } = require('@google-cloud/storage');
const storage = new Storage();
const functions = require('firebase-functions');
const firestore = require('firebase-admin').firestore();

exports.imageFirestoreCreate = functions.storage
  .bucket()
  .onFinalize(async (object) => {
    console.log(object);
    if (
      object.contentType.startsWith("image/") &&
      object.name.startsWith("images/")
    ) {
      const uploadDate = object.timeCreated;
      // 获取当前存储桶中的目标文件对象
      const file = storage.bucket(object.bucket).file(object.name);
      // 生成签名URL,配置为只读权限,有效期可自定义
      const [imageLink] = await file.getSignedUrl({
        action: 'read',
        expires: '03-01-2500' // 设置为远未来时间,近似永久有效
      });

      const images = firestore.collection("images");

      return images.add({
        imageURL: imageLink,
        createdAt: uploadDate,
      });
    } else {
      return null;
    }
  });

需要注意的几点:

  • 确保Cloud Function的服务账号拥有storage.objects.get权限(默认情况下,Cloud Function的默认服务账号已具备该权限)。
  • 签名URL的有效期可以根据业务需求调整,不需要永久有效时,设置合理的过期时间即可。

内容的提问来源于stack exchange,提问作者Coolkid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 16:19:58