我希望在触发Firestore更新云功能时使用其HTTP URL引用图像,以便我可以从change
函数提供的onUpdate()
中获取URL并使用它来获取引用到Firebase存储上的映像并删除它。
答案 0 :(得分:1)
要从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(如果是网络应用,则可能是通过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()
});