firebase - 如何在云功能上创建具有管理员权限的 refFromURL?
问题描述
我想在触发firestore更新云功能时使用其http URL引用图像,以便我可以从函数change
提供的url中获取urlonUpdate()
并使用它来获取对firebase存储上图像的引用并将其删除。
解决方案
为了从 Cloud Function 中删除存储在 Cloud Storage for Firebase 中的文件,您需要创建一个File
基于以下内容的对象:
此文件附加到的 Bucket 实例;
文件名,
然后调用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()
});
推荐阅读
- php - Jquery Ajax 在 ios safari 中不起作用,但数据插入到数据库中
- angularjs - Keycloak 主题:更新 AngularJS 文件
- c# - 使用 AutoMapper C# 将模型的每两行的一列映射到另一个模型的单行的两列
- angular - 垫表中的 Ngx 分页(角度)
- php - 创建、删除同一个文件有副作用吗?
- javascript - 如何使用 Javascript 在输入搜索框中打印 URL 参数值?
- sql - 如何使用 INSERT INTO SELECT
- javascript - 需要帮助自动重新排序深度嵌套的对象/数组
- selenium-webdriver - 单击特定 web 元素时获取“org.openqa.selenium.InvalidArgumentException:无效参数”
- javascript - 关闭中的画布元素正在意外更改