如何在Firebase云功能中调用refFromURL

时间:2017-07-11 21:52:10

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

我使用网址存储对Firebase云存储中文件的引用。在firebase客户端代码中,您可以调用firebase.storage().refFromURL(photo.image)来获取实际的存储引用,并使用它来执行诸如call delete之类的便捷操作。如何在云功能(特别是实时数据库触发器)中完成相同的操作?我希望能够在删除引用它们的对象后清理图像。

5 个答案:

答案 0 :(得分:1)

在云功能中,要从存储中删除文件,您需要文件的存储桶名称和文件名(包括路径)。这些可以从客户端从存储参考获得。例如,JS Storage Reference具有属性bucketfullPath。存储引用的字符串表示形式为: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。云功能可能不提供与客户端相同的功能,因为云功能现在是测试版,人们仍在努力。