FirebaseStorage:如何删除目录

ish*_*haq 13 ios firebase swift firebase-storage

400当我尝试删除目录时,FirebaseStorage始终返回错误,例如以下内容始终返回错误400.

let storageRef = FIRStorage.storage().reference().child("path/to/directory")
storageRef.deleteWithCompletion { (error) in
    print("error: \(error)") // always prints error code 400
}
Run Code Online (Sandbox Code Playgroud)

但是,删除文件工作正常,例如不会返回错误:

let storageRef = FIRStorage.storage().reference().child("path/to/file.jpg")
storageRef.deleteWithCompletion { (error) in
    print("error: \(error)") // works fine, error is nil
}
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么?我不认为它不受FirebaseStorage的支持,因为从目录中逐个删除文件会非常蹩脚(特别是如果所述目录有100或1000个).

The*_*Cat 16

从安全的谷歌云功能的背景 - 您可以使用谷歌云存储npm包(也称为谷歌云存储API)删除整个目录,如下所示:

const gcs = require('@google-cloud/storage')();
const functions = require('firebase-functions');
...
  const bucket = gcs.bucket(functions.config().firebase.storageBucket);

  return bucket.deleteFiles({
    prefix: `users/${userId}/`
  }, function(err) {
    if (err) {
      console.log(err);
    } else {
      console.log(`All the Firebase Storage files in users/${userId}/ have been deleted`);
    }
  });
Run Code Online (Sandbox Code Playgroud)

有关GCS API文档的更多文档

  • 给我一个错误.尝试使用`const bucket = admin.storage().bucket();`,对我来说它可行. (3认同)

coo*_*994 16

2020 年,删除 Firebase Storage 文件夹似乎可行。我刚刚在我的 Cloud Functions (Node.js Admin) 中删除了文件夹、子文件夹和其中的文件。我确实使用 npm 下载了 Google Cloud Storage,但我并没有以任何物理方式导入该库,而且 Firebase Storage 现在似乎支持此功能,这与上面每个人所说的不同。也许他们已经更新了它。我测试它可以正常工作。

admin.initializeApp({
    storageBucket: "bucket_name.appspot.com",
})

const bucket = admin.storage().bucket();
await bucket.deleteFiles({
   prefix: `${folderName}/`
});
Run Code Online (Sandbox Code Playgroud)

  • 这显示了通过管理 API 获取存储桶引用,并使用 GCS API 删除文件夹。问题是关于从 firebase 存储客户端 API 中删除文件。因此,虽然它可能对人们有用,但它并不能回答所提出的问题。 (3认同)

ish*_*haq 14

从谷歌组,删除目录是不可能的.您必须在某处(在Firebase数据库中)维护文件列表并逐个删除它们.

https://groups.google.com/forum/#!topic/firebase-talk/aG7GSR7kVtw

我还提交了功能请求,但由于他们的错误跟踪器不公开,因此没有可以分享的链接.


Mik*_*iki 12

您可以列出文件夹并递归删除其内容:

      deleteFolderContents(path) {
        const ref = firebase.storage().ref(path);
        ref.listAll()
          .then(dir => {
            dir.items.forEach(fileRef => {
              this.deleteFile(ref.fullPath, fileRef.name);
            });
            dir.prefixes.forEach(folderRef => {
              this.deleteFolderContents(folderRef.fullPath);
            })
          })
          .catch(error => {
            console.log(error);
          });
      }

      deleteFile(pathToFile, fileName) {
        const ref = firebase.storage().ref(pathToFile);
        const childRef = ref.child(fileName);
        childRef.delete()
      }
Run Code Online (Sandbox Code Playgroud)


Hen*_*ahl 7

根据TheFastCat的回答和Teodor Ciuraru的评论,我创建了以下 Firebase 云功能,当从 Firebase 身份验证中删除用户时,该功能会删除用户的文件夹。

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

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

exports.deleteUser = functions.auth.user().onDelete(async (user) => {
    const { uid } = user
    await bucket.deleteFiles({
        prefix: `${uid}/`
    })
})
Run Code Online (Sandbox Code Playgroud)


Mar*_*cos 6

一种方法可以是以下(使用最后一个文件,摆脱 dir):

let ref = firebase.storage().ref(path);
ref.listAll().then(dir => {
  dir.items.forEach(fileRef => {
    var dirRef = firebase.storage().ref(fileRef.fullPath);
    dirRef.getDownloadURL().then(function(url) {
      var imgRef = firebase.storage().refFromURL(url);
      imgRef.delete().then(function() {
        // File deleted successfully 
      }).catch(function(error) {
        // There has been an error      
      });
    });
  });
}).catch(error => {
  console.log(error);
});
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用 Firebase 存储,您可能需要将 `rules_version = '2';` 添加到您的 Firebase 规则中,否则 `ref.listAll()` 会失败 (2认同)

nip*_*hka 5

现在您知道我们无法删除 firebase 存储中的文件夹。但是您可以列出该文件夹中的文件并删除每个文件。

这里有一个示例..

        // Create a root reference
        var storageRef = firebase.storage().ref();
        // Create a reference 
        var mountainsRef = storageRef.child("your root path");

        // Now we get the references of these files
        mountainsRef.listAll().then(function (result) {
            result.items.forEach(function (file) {
               file.delete();
            });
        }).catch(function (error) {
            // Handle any errors
        });
Run Code Online (Sandbox Code Playgroud)

Flutter firebase 存储listAll()方式目前在 dev 版本的包中可用,在 version 中5.0.0-dev.1,可以如上图使用。