代码之家  ›  专栏  ›  技术社区  ›  user3116871

使用具有云功能的下载url从firebase存储中删除文件

  •  7
  • user3116871  · 技术社区  · 6 年前

    我在Firestore db中有一个配置文件集合和一个名为“profilePicture”的字段,该字段的值为downloadUrl。

    我正在使用云功能,很长一段时间以来一直在试图弄清楚如何在删除配置文件时删除profilePicture。

    我知道如何在删除配置文件时创建触发器并获取配置文件图片下载URL,但如何仅使用下载URL从存储中删除文件?

    6 回复  |  直到 6 年前
        1
  •  12
  •   Peza    6 年前

    这个 firebase storage documentation 提供一种方法 refFromURL(url) 可用于 Storage 例子它指出 url 参数可以是:

    URL格式为:

    1) gs://URL,例如gs://bucket/files/image。巴布亚新几内亚

    2) 从对象元数据获取的下载URL。

    基于以上(2),HTTP URL似乎也应该可以工作。然而,存储路径字符串可能是更好的做法,因为HTTP URL上的标记可以通过Firebase进行旋转。

        2
  •  7
  •   Mahmoud Abu Alheja sbzoom    4 年前

    对于 admin.storage.Storage 没有用于从url获取存储引用的内置方法

    但您可以通过删除从URL提取文件路径 baseUrl 并在URL上执行一些代码替换

    此任务的im create方法接受存储项目的url并返回路径

    function getPathStorageFromUrl(url:String){
    
        const baseUrl = "https://firebasestorage.googleapis.com/v0/b/project-80505.appspot.com/o/";
    
        let imagePath:string = url.replace(baseUrl,"");
    
        const indexOfEndPath = imagePath.indexOf("?");
    
        imagePath = imagePath.substring(0,indexOfEndPath);
        
         imagePath = imagePath.replace("%2F","/");
        
     
        return imagePath;
    }
    

    注: 您必须更换 baseUrl 对于每个项目,您都可以通过打开存储中的任何图像来找到它,并从浏览器中的URL将其从最后一个斜杠“/”的开头复制到结尾

    例如:

    Some image link on my storage : 
    https://firebasestorage.googleapis.com/v0/b/project-80505.appspot.com/o/RequestsScreenshot%2F-M6CA-2bG2aP_WwOF-dR__1i5056O335?alt=media&token=d000fab7
    
    the base URL will be 
    https://firebasestorage.googleapis.com/v0/b/project-80505.appspot.com/o/ 
    

    现在,在获取路径后,调用文件将其从存储中删除

    const storage = admin.storage();
    
    const imagePath:string = getPathStorageFromUrl(obj.imageUrl);
    
    storage.bucket().file(imagePath).delete().catch((err) => console.error(err));
    

    笔记 :没有说明URL格式的文档, 这意味着Firebase团队可能觉得有必要改变它 总有一天,如果格式发生变化,意味着将来可能无法使用。

        3
  •  6
  •   Doug Stevenson    6 年前

    我的理解是 node SDK for Cloud Storage 无法将HTTP URL转换为存储桶中的文件路径。相反,您应该在文档中存储文件路径和下载URL。这将使构建一个文件对象成为可能,该对象可用于在需要时删除图像。

        4
  •  6
  •   David Buck RevolverRakk    4 年前

    在Angular中,我通过下载URL从Cloud Firestore中删除文件

    constructor(private storage: AngularFireStorage) {}
    
    onDeleteAttachment(downloadURL: string) {
      this.storage.storage.refFromURL(downloadURL).delete();
    }
    
        5
  •  2
  •   Meet Bhavsar    3 年前

    正在确认。js公司

    import firebase from 'firebase/app'
    import "firebase/firestore";
    import "firebase/storage";
    
    const firebaseConfig = {
                apiKey: "XXXX",
                authDomain: "XXXXX.firebaseapp.com",
                databaseURL: "https://XXXX-app-web.firebaseio.com",
                projectId: "XXXX",
                storageBucket: "XXXX-app-web.appspot.com",
                messagingSenderId: "XXXXXX",
                appId: "1:XXX:web:XXXX",
                measurementId: "G-XXXX"
    };
    firebase.initializeApp(firebaseConfig);
    export const firestore = firebase.firestore();
    export const storageRef = firebase.storage();
    
    export default firebase;
    
    

    按钮js公司

    import React from 'react';
    import {firestore,storageRef} from './Config';
    
    function removeFile(id,downloadUrl) {
      const storageRefa = storageRef.refFromURL(downloadUrl);
    
      storageRefa.delete().then(() => {
        firestore.collection("All_Files").doc(id).delete().then((response) => {
          console.log('delete response', response)
        }).catch((error) => {
          console.log('delete error', error)
        })
      }).catch((error) => {
        console.log('delete error', error)
      });
    }
    export default function MediaCard(props) {
      return (
        <>
               <Button
                  onClick={() =>{
                    removeFile(props.ID,props.downloadUrl)
                  }}
                  variant="contained"
                  color="secondary"
              >
                Delete
              </Button>
        </>
      );
    }
    
        6
  •  0
  •   Justice Addico    3 年前

    马哈茂德的回答需要稍加修改。。这很管用。。他错误地进行了替换,如果存储中有嵌套目录或间隔文件名,他可能无法工作

    getPathStorageFromUrl(url:String){
    
            const baseUrl = "https://firebasestorage.googleapis.com/v0/b/project-80505.appspot.com/o/";
        
            let imagePath:string = url.replace(baseUrl,"");
        
            const indexOfEndPath = imagePath.indexOf("?");
        
            imagePath = imagePath.substring(0,indexOfEndPath);
            
            imagePath = imagePath.replace(/%2F/g,"/");
            
            imagePath = imagePath.replace(/%20/g," ");
         
            return imagePath;
        }