使用带云功能的下载URL从firebase存储中删除文件

时间:2018-04-20 15:41:43

标签: node.js firebase google-cloud-storage google-cloud-firestore

我的Firestore数据库中有一个配置文件集合,以及一个名为" profilePicture"的字段。使用downloadUrl作为值。

我正在使用云功能,并且在删除配置文件时已经尝试了很长时间来弄清楚如何删除profilePicture。

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

6 个答案:

答案 0 :(得分:3)

firebase storage documentation提供了一个可以在refFromURL(url)实例上使用的方法Storage。它声明url参数可以是:

  

表格中的网址:

     

1)gs:// URL,例如gs://bucket/files/image.png

     

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

基于上面的(2),似乎HTTP URL也应该起作用。但是,存储路径字符串可能是更好的做法,因为HTTP URL上的令牌可以由Firebase轮换。

答案 1 :(得分:3)

用于 TOTAL LEUCOCYTES COUNT (TLC) 23160 DIFFERENTIAL LEUCOCYTES COUNT (DLC) NEUTROPHILS 93.4 LYMPHOCYTES 3.3 MONOCYTES 3.1 EOSINOPHILS 0.2 BASOPHILS 0.0 ABSOLUTE NEUTROPHILS 21620.0 ABSOLUTE LYMPHOCYTES 750.0 ABSOLUTE MONOCYTES 730.0 ABSOLUTE EOSINOPHILS 50.0 ABSOLUTE BASOPHILS 10.0 RBC COUNT 4.31 HAEMOGLOBIN (Hb) 13.1 P.C.V/HCT 41.2 MCV 95.5 MCH 30.3 MCHC 31.8 RDW / SD 49.7 RDW / CV 12.3 PLATELET COUNT 148000 PDW 17.0 MPV 13.3 PCT 0.198 的方法不是用于从url获取存储引用的内置方法

,但是您可以从URL中提取文件路径,方法是删除 baseUrl 并在URL上执行一些代码替换

此任务的im创建方法可以接受来自存储项目的URL并返回路径

admin.storage.Storage

注意::您必须为每个项目替换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; } ,可以通过打开存储中的任何图像来找到它,并从浏览器中的URL复制到最后一个斜杠的末尾。 '/'

Ex:

baseUrl

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

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/ 

注意:没有文档说明URL的格式, 这意味着Firebase团队可能会觉得有必要对其进行更改 有一天,如果格式更改,则意味着将来可能无法使用。

答案 2 :(得分:2)

在Angular中,我使用它通过downloadURL从Cloud Firestore中删除文件

constructor(private storage: AngularFireStorage) {}

onDeleteAttachment(downloadURL: string) {
  this.storage.storage.refFromURL(downloadURL).delete();
}

答案 3 :(得分:0)

我的理解是node SDK for Cloud Storage无法将HTTP URL转换为存储桶中的文件路径。相反,您应该将文件路径与下载URL一起存储在文档中。这样就可以构建一个File对象,可以在它有时间的时候删除它。

答案 4 :(得分:0)

Mahmoud 的回答需要稍加修改 .. 它可以工作 .. 他正在错误地进行替换,如果您的存储中有嵌套目录或间隔的文件名,则可能无法工作

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;
    }

答案 5 :(得分:0)

confing.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;

Button.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>
    </>
  );
}