如何在Firebase函数中获取DownloadURL

时间:2019-11-04 07:50:50

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

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

我要获取此URL。

根据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”,

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

3 个答案:

答案 0 :(得分:3)

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

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

另请参阅:Get Download URL from file uploaded with Cloud Functions for Firebase

答案 1 :(得分:2)

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

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 :(得分:0)

对于其他偶然发现的人,以下代码对我有用。 其他答案对我的用法不起作用,因为我不希望链接过期。

我一般仍在学习JS和编程,因此,我确定可以进一步优化此代码,例如:

UploadResponse同时包含一个File和一个Metadata对象,但是我无法弄清楚如何直接过滤元数据,而不得不使用File来获取其元数据。

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);