【问题标题】:Firebase Storage-How to delete file from storage with node.js?Firebase 存储-如何使用 node.js 从存储中删除文件?
【发布时间】:2019-06-03 00:17:06
【问题描述】:

我想用 node js 删除 firebase 存储中的一个文件夹,因为这是一个 firebase 功能。

例如:

storageRef.child(child1).child(child2).delete();

类似这样,但 firebase 文档没有说明任何内容。

还有一个问题: 初始化存储文档时节点 js 需要我的 admin json,但实时数据库不想要这个奇怪为什么?

【问题讨论】:

  • 无法从 Firebase 存储中删除文件夹。见stackoverflow.com/questions/38214052/…。要删除文件夹中的所有文件,您需要知道有哪些文件,因为无法通过 Firebase SDK 获取文件夹中的文件列表,请参阅:stackoverflow.com/questions/37335102/…
  • @FrankvanPuffelen 但我可以删除浏览器中的文件夹。这与 firebase sdk 有关吗?
  • 正确。 Firebase SDK 不允许删除文件夹。
  • @FrankvanPuffelen 我刚刚意识到一些事情。我的存储空间中有 6-8 件物品。10 件带有文件夹。而且我总是在浏览器中删除文件夹。但是当我查看我的存储使用情况时,它总共显示 230 个项目。所以在浏览器中删除文件夹也不起作用,只是让文件夹不可见?

标签: node.js firebase google-cloud-functions firebase-storage firebase-admin


【解决方案1】:

查看用于 Google Cloud Storage 的 Node.js 客户端 API Reference,尤其是用于 Filedelete() 方法。

【讨论】:

  • 但它要求我启用计费。这是为什么呢?我使用 firebase-functions 删除 - 将数据写入 firebase 实时数据库,它工作正常。
【解决方案2】:

你可以使用 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 网站上查看此信息: how to delete files Firebase-storage

【讨论】:

  • 问题是关于删除文件夹。你的答案只是删除一个文件。
  • @bjorni 只是从网络调用中删除图像名称。
【解决方案3】:

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

我测试了删除一个里面有 2 张图片的文件夹,它可以工作。然后我尝试了一个文件夹-A,其内容为:文件夹-B + 图片-A。文件夹-B里面也有图片-B;它仍然删除了文件夹 A 及其所有内容。

解决方法:

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

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

我在官方文档中找不到这个(也许真的是新的 API),但我在其中找到了解决方案的文章非常酷: Automatically delete your Firebase Storage Files from Firestore with Cloud Functions for Firebase

【讨论】:

  • 说真的这是个坏主意,如果你错误地将空字符串作为前缀传递给它,你知道会发生什么吗?该存储桶中的所有文件都将被删除
  • 耶!这只是 )(*$@*(#$# 发生在我身上!虽然我没有给它一个空字符串。我确实有我想要删除的文件夹的路径......亲爱的上帝......
  • 您分享的链接是用于打字稿的任何人都有用于 js 的?
  • 我的意思是你(@Harkal)没有错,但为什么假设你在执行此类操作之前不执行验证。
【解决方案4】:
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"

【讨论】:

    猜你喜欢
    • 2021-07-07
    • 2022-01-02
    • 1970-01-01
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 2020-07-10
    相关资源
    最近更新 更多