我使用网址存储对Firebase云存储中文件的引用。在firebase客户端代码中,您可以调用firebase.storage().refFromURL(photo.image)
来获取实际的存储引用,并使用它来执行诸如call delete之类的便捷操作。如何在云功能(特别是实时数据库触发器)中完成相同的操作?我希望能够在删除引用它们的对象后清理图像。
答案 0 :(得分:1)
在云功能中,要从存储中删除文件,您需要文件的存储桶名称和文件名(包括路径)。这些可以从客户端从存储参考获得。例如,JS Storage Reference具有属性bucket
和fullPath
。存储引用的字符串表示形式为:gs://example-12345.appspot.com/path/to/file
,其中存储区为example-12345.appspot.com
,文件为#34; name"是path/to/file
。
在下面显示的示例云功能中,客户端应提供存储桶和文件名作为触发位置的子项。您还可以将URL字符串写入触发器位置,然后将其拆分为云功能中的存储桶和文件名组件。
此代码基于Cloud Storage guide。
中的示例const functions = require('firebase-functions');
const gcs = require('@google-cloud/storage')();
const admin = require('firebase-admin');
admin.initializeApp(functions.config().firebase);
exports.deleteFile = functions.database.ref('/test').onWrite(event => {
const bucket = event.data.child('bucket').val();
const filename = event.data.child('filename').val();
console.log('bucket=', bucket, 'filename=', filename);
return gcs.bucket(bucket).file(filename).delete().then(() => {
console.log(`gs://${bucket}/${filename} deleted.`);
}).catch((err) => {
console.error('ERROR:', err);
});
});
答案 1 :(得分:0)
我已经基于Bob Snyder的答案在我的函数项目中编写了代码示例,该示例由web-firebase中的refFromURL
方法使用。
function refFromUrl(gsLink) {
var fileEntryTemp = gsLink.file.replace("gs://", "")
var bucketName = fileEntryTemp.substring(0, fileEntryTemp.indexOf("/"));
var filename = gsLink.file.match("gs://" + bucketName + "/" + "(.*)")[1];
var gsReference = admin.storage().bucket().file(filename);
return gsReference;
}
这里是一个示例,我如何基于该参考获得下载链接:
var gsReference = refFromUrl(fileEntry);
gsReference.getSignedUrl({
action: 'read',
expires: '03-09-2491'
}).then(function (url) {
console.log(url);
response.send(url);
}).catch(function (error) {
});
希望这可以节省一些人的时间
答案 2 :(得分:0)
根据Bob Snider的回答,这是一个从URL提取文件完整路径的小函数(打字稿)。
export const getFileFromURL = (fileURL: string): Promise<any> => {
const fSlashes = fileURL.split('/');
const fQuery = fSlashes[fSlashes.length - 1].split('?');
const segments = fQuery[0].split('%2F');
const fileName = segments.join('/');
return fileName;
}
答案 3 :(得分:0)
这是从网址中提取完整路径的相当简单的功能。
const refFromURL = (URL) => {
return decodeURIComponent(URL.split('/').pop().split('?')[0])
}
答案 4 :(得分:-1)
对于云功能对数据库的复杂操作,您可以使用Admin SDK https://firebase.google.com/docs/database/admin/start
。对于云功能中云存储的使用,请查看https://firebase.google.com/docs/functions/gcp-storage-events。云功能可能不提供与客户端相同的功能,因为云功能现在是测试版,人们仍在努力。