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

如何在Firebase云函数中获取Firebase Storage生成的下载链接

原因说明

mediaLink是Google Cloud Storage的原生资源链接,默认要求请求携带身份认证凭证、且拥有对应资源的storage.objects.getIAM权限才能访问,和Flutter端getDownloadUrl()、Firebase控制台提供的匿名可访问下载链接逻辑不同,所以直接用会报匿名用户无权限的错误。

解决方法

使用Firebase Admin SDK中存储文件实例的getSignedUrl()方法生成符合要求的下载链接,生成的链接自带签名令牌,无需额外身份校验即可访问,和Firebase控制台、Flutter端获取的下载链接效果完全一致。

修改后的代码示例

exports.generateThumbnail = functions.storage.object().onFinalize(async (object) => {
    const db = admin.firestore();
    const filePath = object.name;
    const contentType = object.contentType; 
    const fileDir = path.dirname(filePath);
    const fileName = path.basename(filePath);
    
    const jobId = fileName.replace("poster_","").replace(".png","");
    const bucket = admin.storage().bucket(object.bucket);
    const file = bucket.file(filePath);

    // 配置签名URL参数
    const signedUrlOptions = {
        action: 'read',
        expires: '01-01-2500' // 可自定义有效期,设置为极晚日期即可实现近似永久可用
    };
    // 生成下载链接
    const [posterFileUrl] = await file.getSignedUrl(signedUrlOptions);
    
    // 此处写入Firestore对应文档即可
    await db.collection('你的集合名').doc(jobId).set({
        posterUrl: posterFileUrl
    }, { merge: true });

    functions.logger.log('生成的下载链接: '+ posterFileUrl );
    return null;
});

注意事项

  • Cloud Function默认使用的服务账号默认拥有存储桶的读取权限,无需额外配置权限即可正常生成签名URL
  • 如果后续需要禁用某个已生成的下载链接,在Firebase Storage控制台找到对应文件,撤销公开访问令牌即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 05:12:01