【问题标题】:How to getDownloadURL in a Firebase Function如何在 Firebase 函数中获取下载 URL
【发布时间】:2023-03-13 06:30:01
【问题描述】:

使用 Firebase 存储存储图像时,图像的 URL 如下所示: https://firebasestorage.googleapis.com/v0/b/[MY-APP].appspot.com/o/[FILE-NAME]?alt=media&token=[TOKEN]

我想获取这个网址。

根据thisthisthisthis,我需要使用“存储引用”上的.getDownloadURL() 方法.. 但是可用对象的文档确实与实物不符。

当我尝试访问下面代码中文档建议的对象上的 .getDownloadURL() 方法时,我收到各种未找到属性的错误。

        const admin = require('firebase-admin');
        admin.initializeApp();

        admin
        .storage()
        .bucket()
        .upload(imageToBeUploaded.filepath, {
            destination: storageFolder,
            resumable: false,
            metadata: {
                metadata: {
                contentType: imageToBeUploaded.mimetype
                }
        }
        })
        .then((taskSnapshot) => {
            // HOW DO I GET THE DOWNLOADABLE URL 
        })

我尝试了以下方法:

taskSnapshot[1].getDownloadURL(),

admin.storage().ref(storageFolder+'/'+imageFileName).getDownloadURL(),

admin.storageRef(storageFolder+'/'+imageFileName).getDownloadURL(),

admin.storage().ref().child(storageFolder+'/'+imageFileName).getDownloadURL(),

.. 和一堆其他人。

反复试验是找不到具有该方法的“storageRef”,

如何获取图片的可下载网址?

【问题讨论】:

    标签: firebase google-cloud-functions firebase-storage firebase-admin


    【解决方案1】:

    我使用的解决方案是首先更改存储桶的访问规则,如下所示:

    https://console.firebase.google.com/u/0/project/[MY_APP]/storage[MY_APP].appspot.com/rules

    rules_version = '2';
    service firebase.storage {
      match /b/{bucket}/o {
        match /{allPaths=**} {
          allow read;
          allow write: if request.auth != null;
        }
      }
    }
    

    这意味着 URL 上不需要令牌即可查看图像。

    然后我刚刚对 URL 进行了硬编码:

                .then((taskSnapshot) => {
                    const imageUrl = `https://firebasestorage.googleapis.com/v0/b/` +
                                     `${MY_APP_ID}.appspot.com/o/${imageFileName}?alt=media`;
                    return imageUrl;
                })
    

    【讨论】:

      【解决方案2】:

      Firebase Admin SDK 封装了 Google Cloud Storage SDK,因此它们的 API 相同。 Cloud Storage SDK 不提供与移动和网络 SDK 提供的下载网址完全相同的下载网址。

      你可以做的是生成一个signed URL,它在功能上是相似的。

      另见:Get Download URL from file uploaded with Cloud Functions for Firebase

      【讨论】:

      • 小心:使用您在 Firebase 函数中生成的签名 URL 存在一个大问题。您可以在github.com/googleapis/nodejs-storage/issues/244 阅读更多内容,但简短的版本是:即使您指定一天的到期时间,它也可能在 之前 到期,并且您的所有链接都会中断,因为服务帐户的私钥被轮换自动,这会破坏签名的网址。这个令人沮丧的问题的一种解决方法显然是停止使用serviceAccountId 并返回到 json 证书,呃。
      【解决方案3】:

      对于其他偶然发现此问题的人,以下代码适用于我。 其他答案不适合我的使用,因为我不希望链接过期。

      我还在学习 JS 和一般的编程,所以我确信这段代码可以进一步优化,例如:

      UploadResponse 包含文件和元数据对象,但我不知道如何直接过滤元数据,必须使用文件才能获取其元数据。

      const uploadResponse: storage.UploadResponse = await bucket.upload(tempFilePath);
      for (const value of uploadResponse) {
        if (value instanceof storage.File) {
          const metadata = await value.getMetadata();
          const downloadUrl: string = metadata.shift().mediaLink;
        }
      }
      fs.unlinkSync(tempFilePath);

      【讨论】:

        猜你喜欢
        • 2021-05-09
        • 2019-06-27
        • 2021-08-11
        • 2020-12-05
        • 1970-01-01
        • 2019-11-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-23
        相关资源
        最近更新 更多