【问题标题】:Delete Firebase Storage image url with download url使用下载 url 删除 Firebase 存储图像 url
【发布时间】:2018-05-02 17:22:07
【问题描述】:

我使用 Firebase 存储和实时数据库分别存储图像及其下载 url。文件名以随机方式生成,下载 url 生成并保存到实时数据库中。

场景: 如果用户上传新图像(例如个人资料图像),我想在 downloadImageurl 的帮助下删除旧图像(最初上传图像时会生成下载图像 url,并将其保存在实时数据库中)。旧图像如何已删除?我已尝试以下代码,但要使其正常工作,我必须获取文件名。

gcs
            .bucket("e**********.appspot.com") // find it in Firebase>Storage>"gs://...." copy without gs 
             //or go to console.cloud.google.com/ buckets and copy name
            .file("images/" +event.params.uid+"/"+filename) //file location in my storage
            .delete()
            .then(() => {
                console.log(`gs://${bucketName}/${filename} deleted.`);
            })
            .catch(err => {
                console.error('ERROR-DELETE:', err+ " filename: "+filename);
            });

【问题讨论】:

  • 您是否在 Cloud Functions 中运行此代码?您正在使用 Google Cloud Storage 节点 API?如果您提供更多关于这里发生的事情的背景信息,这可能会有所帮助。
  • @DougStevenson 是的,我正在使用云功能。请查找更新后的问题
  • 我正在使用 const gcs = require('@google-cloud/storage')();并按照 github 教程生成缩略图。有关此的任何帮助都将有助于进一步进行
  • 您可以将文件的路径存储在 Storage 中,也可以存储下载 URL。当需要删除时,您也可以使用它的路径。

标签: firebase firebase-realtime-database firebase-storage google-cloud-functions


【解决方案1】:

这可能会对您有所帮助。

此代码将从 URL 中获取文件名并删除该文件。目前这个解决方案对我有用!

代码

import * as firebase from 'firebase';
...
let name = imagePath.substr(imagePath.indexOf('%2F') + 3, (imagePath.indexOf('?')) - (imagePath.indexOf('%2F') + 3));
name = name.replace('%20',' '); 
let storagePath = firebase.storage().ref();
storagePath.child(`images/${name}`).delete();

【讨论】:

    【解决方案2】:

    取决于你想要什么:

    1. 保留原始图像,以后可以手动删除。
    2. 生成缩略图后立即删除。

    我猜你正在使用this example

    1- 您必须将文件路径存储在您的数据库中。然后每当您想从前面删除它时:

    import * as firebase from 'firebase';
    ...
    const store = firebase.storage().ref();
    // Depending on which db you use and how you store, you get the filePath and delete it:
    store.child(image.filePath).delete();
    

    2- 像这样从 firebase 函数继续承诺:

    // ...LAST PART OF THE EXAMPLE...
    .then(() => {    
    // Add the URLs to the Database
    return admin.database().ref('images').push({path: fileUrl, thumbnail: thumbFileUrl});
    }).then(() => {
    // ...PART YOU CAN ADD TO DELETE THE IMAGE UPLOADED
    const bucket = gcs.bucket(bucket);
    bucket.file(filePath).delete();
    })
    

    “bucket”是之前创建的常量:

    const bucket = gcs.bucket(event.data.bucket);
    

    还有“filePath”:

    const filePath = event.data.name;
    

    【讨论】:

      【解决方案3】:

      要删除带有 url 的图像,您可以使用 refFromUrl() 函数获取 ref 然后轻松删除它

      const storage = firebase.storage();
      storage.refFromURL(imageUrl).delete()
      

      【讨论】:

        【解决方案4】:
            const downloadUrl = "https://firebasestorage.googleapis.com/v0/b/***.appspot.com/o/***?alt=media&token=***";
        

        第一个 *** 代表 FIREBASE_STORAGE_BUCKET
        第二个***代表文件在bucket中的位置
        第三个***代表公共访问图像/文件的令牌

        作为一名网络开发人员,您知道 URI 是这样编码的 "@" = "%40", "$" = "%24", " " = "%20" 等

        由于我们使用的是 JavaScript,我们可以做的是像这样解码 URI 以获得确切的路径

        const path = decodeURIComponent(downloadUrl.split("o/")[1].split("?")[0]);
        
        return await bucket
          .file(path)
          .delete()
          .then(() => true)
          .catch((error) => {
            throw new TypeError(`deleteImages ${error}`);
          });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-01-09
          • 2018-08-09
          • 2018-02-04
          • 2018-10-01
          • 2020-02-29
          • 2020-10-22
          • 2018-04-11
          • 2020-07-10
          相关资源
          最近更新 更多