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)
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)
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)
根据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)
一种方法可以是以下(使用最后一个文件,摆脱 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 存储中的文件夹。但是您可以列出该文件夹中的文件并删除每个文件。
这里有一个示例..
// 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,可以如上图使用。
| 归档时间: |
|
| 查看次数: |
8538 次 |
| 最近记录: |