首页 > 解决方案 > 如何在云功能上创建具有管理员权限的 refFromURL?

问题描述

我想在触发firestore更新云功能时使用其http URL引用图像,以便我可以从函数change提供的url中获取urlonUpdate()并使用它来获取对firebase存储上图像的引用并将其删除。

标签: firebasegoogle-cloud-firestoregoogle-cloud-functionsfirebase-storage

解决方案


为了从 Cloud Function 中删除存储在 Cloud Storage for Firebase 中的文件,您需要创建一个File基于以下内容的对象:

  1. 此文件附加到的 Bucket 实例;

  2. 文件名,

然后调用delete()方法

如 Node.js 库文档https://cloud.google.com/nodejs/docs/reference/storage/2.0.x/File中所述。

以下是文档中的代码示例:

const storage = new Storage();
const bucketName = 'Name of a bucket, e.g. my-bucket';
const filename = 'File to delete, e.g. file.txt';

// Deletes the file from the bucket
storage
  .bucket(bucketName)
  .file(filename)
  .delete()
  .then(() => {
    console.log(`gs://${bucketName}/${filename} deleted.`);
  })
  .catch(err => {
    console.error('ERROR:', err);
  });

根据您的问题,我了解到您的应用程序客户端没有存储桶和文件名,只有一个下载 URL(如果它是 Web 应用程序,可能通过getDownloadURL生成,或者其他 SDK 的类似方法生成)。

因此,挑战是从下载 URL 派生存储桶和文件名。

如果您查看下载 URL 的格式,您会发现它的组成如下:

https://firebasestorage.googleapis.com/v0/b/<your-project-id>.appspot.com/o/<your-bucket-name>%2F<your-file-name>?alt=media&token=<a-token-string>

因此,您只需要使用一组 Javascript 方法,如indexOf(),substring()和/或slice()从下载 URL 中提取存储桶和文件名。

基于上述情况,您的 Cloud Function 代码可能如下所示:

const storage = new Storage();

.....

exports.deleteStorageFile = functions.firestore
    .document('deletionRequests/{requestId}')
    .onUpdate((change, context) => {
      const newValue = change.after.data();
      const downloadUrl = newValue.downloadUrl;

      // extract the bucket and file names, for example through two dedicated Javascript functions
      const fileBucket = getFileBucket(downloadUrl);
      const fileName = getFileName(downloadUrl);

      return storage
        .bucket(fileBucket)
        .file(fileName)
        .delete()

    }); 

推荐阅读