Firebase Storage - 如何使用 node.js 从存储中删除文件?

6
我希望能够使用Node.js删除Firebase存储中的文件夹,因为这是一个Firebase函数。
例如:
storageRef.child(child1).child(child2).delete();

像这样的东西,但 Firebase 文档没有提供任何信息。

还有一个问题: 当初始化存储文档节点js需要我的管理员json,但实时数据库不需要,想知道为什么?


无法从Firebase Storage中删除文件夹。请参见https://dev59.com/W1oT5IYBdhLWcg3wvRlk。要删除文件夹中的所有文件,您需要知道有哪些文件,因为Firebase SDK没有通过文件夹获取文件列表的方法,请参见:https://dev59.com/11oU5IYBdhLWcg3wjHdL - Frank van Puffelen
@FrankvanPuffelen 但我可以在浏览器中删除文件夹。这与Firebase SDK有关吗? - uzaysan
正确。Firebase SDK 不允许删除文件夹。 - Frank van Puffelen
@FrankvanPuffelen,我刚刚意识到了一件事情。我的存储中有6-8个条目和10个文件夹。我总是在浏览器中删除文件夹。但是当我查看存储空间使用情况时,它显示总共有230个条目。所以在浏览器中删除文件夹也行不通,只是使文件夹隐形了吗? - uzaysan
4个回答

7

你可以使用Node.js这样做:

const firebase = require('firebase-admin');

async function deleteImageFromFirebase(imageName) {
    await firebase.storage().bucket().file("folderName/"+imageName).delete();
}

同样地,在客户端方面:

// Create a reference to the file to delete
var desertRef = storageRef.child('images/desert.jpg');

// Delete the file
desertRef.delete().then(function() {
  // File deleted successfully
}).catch(function(error) {
  // Uh-oh, an error occurred!
});

在Firebase网站上查看此信息: 如何删除Firebase存储中的文件


问题是关于删除文件夹的。你的答案只是删除一个文件。 - bjornl
@bjorni只需从网络调用中删除图像名称即可。 - Dustin Spengler
文件夹必须为空才能进行操作,@DustinSpengler - Boni Machado
文件夹必须为空才能进行操作,@DustinSpengler - undefined

5

但它要求我启用计费。为什么?我使用firebase-functions来删除-写入数据到Firebase实时数据库,它运行良好。 - uzaysan

1

可能有些晚了,但至少在Web上(基本上你所需要的),有新的API可以删除整个文件夹。

我测试过删除一个包含2张图片的文件夹,它可以正常工作。然后我尝试删除一个名为文件夹-A的文件夹,它包含:文件夹-B和图片-A。文件夹-B中还有一张图片-B; 它仍然删除了文件夹-A及其所有内容。

解决方案:

const bucket = admin.storage().bucket();

return bucket.deleteFiles({
  prefix: `posts/${postId}`
);

我在官方文档中找不到这个(可能是全新的API),但在一篇很棒的文章中找到了解决方案: 使用Cloud Functions for Firebase自动从Firestore中删除Firebase Storage文件


6
这个主意很糟糕,如果你不小心将一个空字符串作为前缀传递给它,你知道会发生什么吗?那个桶中的所有文件都将被删除。 - Harkal
哎呀!这刚刚发生在我身上了!虽然我没有给它一个空字符串,但我确实把我想要删除的文件夹路径传进去了...天啊... - wesley franks
你分享的链接是 TypeScript 的,有没有 JavaScript 的版本? - Jerin
我的意思是你(@Harkal)并没有错,但为什么要假设在执行这样的操作之前你没有进行验证呢? - Marius Mircea

0
import { storage } from "./firebaseClient";
import { bucket } from "./firebaseServer";

//Let's assume this is the URL of the image we want to delete
const downloadUrl =  "https://storage.googleapis.com/storage/v1/b/<projectID>.appspot.com/o/<location>?"

//firebase delete function
const deleteImages = async ({ downloadUrl }) => {
    const httpsRef = storage.refFromURL(downloadUrl).fullPath;
    return await bucket
        .file(httpsRef)
        .delete()
        .then(() => "success")
        .catch(() => "error")
}

//call the deleteImages inside async function
const deleteStatus = await deleteImages({ downloadUrl: oldImage });
console.log(deleteStatus)  //=> "success"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接