使用带有云函数的下载URL从firebase存储中删除文件

92vpleto  于 2023-02-25  发布在  其他
关注(0)|答案(7)|浏览(131)

我的Firestore数据库中有一个配置文件集合,还有一个名为“profilePicture”的字段,其值为downloadUrl。
我使用云函数,并一直在尝试很长一段时间,以找出如何删除profilePicture时,配置文件被删除。
我知道如何在删除配置文件时创建触发器并获取配置文件图片downloadUrl,但如何从存储中删除只有downloadUrl的文件?

fzsnzjdm

fzsnzjdm1#

firebase存储文档提供了一个可以在Storage示例上使用的方法refFromURL(url),它规定url参数可以是:
URL格式为:
1)一个gs:// URL,例如gs://bucket/files/image.png
2)从对象元数据获取的下载URL。
基于上面的(2),似乎HTTP URL也应该工作。然而,存储路径字符串可能是更好的做法,因为HTTP URL上的令牌可以被Firebase旋转。

nwlqm0z1

nwlqm0z12#

在Angular 我用这个来删除文件从云Firestore的downloadURL

constructor(private storage: AngularFireStorage) {}

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

9jyewag03#

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

uttx8gqw

uttx8gqw4#

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

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

用于此任务IM创建方法,以接受来自存储项目的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团队可能会觉得有必要在某一天更改它,意味着如果格式更改,将来可能无法工作。
mzillmmw

mzillmmw5#

确认.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>
    </>
  );
}
1l5u6lss

1l5u6lss6#

Mahmoud的答案需要一点编辑..它的作品tho ..他是做错误的替换,可能不会工作,如果你有嵌套目录或空间文件名在您的存储

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

yyyllmsg7#

首先在此方法上获取文件路径
常量路径= decodeURIComponent(文件.拆分(“?”)[0].拆分(“/o/”)[1]);
并在API路径字段中添加路径

相关问题