ios - FirebaseStorage: cómo eliminar el directorio
swift firebase-storage (7)
En 26/5/2017 no hay forma de eliminar el directorio Pero puedes usar mi algoritmo
Usa este código.
this.sliders = this.db.list(`users/${this.USER_UID}/website/sliders`) as FirebaseListObservable<Slider[]>
/**
* Delete image from firebase storage is take a string path of the image
* @param _image_path
*/
deleteImage(_image_path: string) {
// first delete the image
const storageRef = firebase.storage().ref();
const imageRef = storageRef.child(_image_path);
imageRef.delete().then(function() {
console.log(''file deleted'');
// File deleted successfully
}).catch(function(error) {
// Uh-oh, an error occurred!
console.log(error);
});
}
/**
* Deletes multiple Sliders, it takes an array of ids
* @param ids
*/
deleteMutipleSliders(ids: any) {
ids.forEach(id => {
this.getSliderDetails(id).subscribe(slider => {
let id = slider.$key; // i think this is not nesesery
const imgPath = slider.path;
this.deleteImage(imgPath);
});
return this.sliders.remove(id);
});
}
FirebaseStorage siempre devuelve el error
400
cuando intento eliminar un directorio, es decir, algo como lo siguiente siempre devuelve el error
400
.
let storageRef = FIRStorage.storage().reference().child("path/to/directory")
storageRef.deleteWithCompletion { (error) in
print("error: /(error)") // always prints error code 400
}
Sin embargo, eliminar un archivo funciona bien, por ejemplo, algo así como no devuelve un error:
let storageRef = FIRStorage.storage().reference().child("path/to/file.jpg")
storageRef.deleteWithCompletion { (error) in
print("error: /(error)") // works fine, error is nil
}
¿Qué podría estar haciendo mal aquí? No creo que FirebaseStorage no lo soporte porque eliminar archivos de un directorio uno por uno sería bastante lamentable (especialmente si dicho directorio tiene 100 o 1000 de estos).
A partir de julio de 2019, puede enumerar una carpeta y eliminar su contenido de forma recursiva:
deleteFolderContents(path) {
let 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);
});
}
Aquí hay una solución para eliminar archivos en una carpeta en Firebase Storage usando Firebase Functions.
Se supone que tiene modelos almacenados en / MyStorageFilesInDatabaseTrackedHere / path1 / path2 en su base de datos Firebase.
Esos modelos tendrán un campo llamado "nombre de archivo" que tendrá el nombre del archivo en Firebase Storage.
El flujo de trabajo es:
- Elimina la carpeta en Firebase Database que contiene la lista de modelos
- Escuche la eliminación de esa carpeta a través de las funciones de Firebase
- Esta función recorrerá los elementos secundarios de la carpeta, obtendrá el nombre de archivo y lo eliminará en Almacenamiento.
(Descargo de responsabilidad: la carpeta en Almacenamiento todavía queda al final de esta función, por lo que se debe realizar otra llamada para eliminarla).
// 1. Define your Firebase Function to listen for deletions on your path
exports.myFilesDeleted = functions.database
.ref(''/MyStorageFilesInDatabaseTrackedHere/{dbpath1}/{dbpath2}'')
.onDelete((change, context) => {
// 2. Create an empty array that you will populate with promises later
var allPromises = [];
// 3. Define the root path to the folder containing files
// You will append the file name later
var photoPathInStorageRoot = ''/MyStorageTopLevelFolder/'' + context.params.dbpath1 + "/" + context.params.dbpath2;
// 4. Get a reference to your Firebase Storage bucket
var fbBucket = admin.storage().bucket();
// 5. "change" is the snapshot containing all the changed data from your
// Firebase Database folder containing your models. Each child has a model
// containing your file filename
if (change.hasChildren()) {
change.forEach(snapshot => {
// 6. Get the filename from the model and
// form the fully qualified path to your file in Storage
var filenameInStorage = photoPathInStorageRoot + "/" + snapshot.val().filename;
// 7. Create reference to that file in the bucket
var fbBucketPath = fbBucket.file(filenameInStorage);
// 8. Create a promise to delete the file and add it to the array
allPromises.push(fbBucketPath.delete());
});
}
// 9. Resolve all the promises (i.e. delete all the files in Storage)
return Promise.all(allPromises);
});
Como se indicó anteriormente, eliminar un directorio no es válido. Estoy compartiendo un ejemplo de consulta de una lista de archivos en Firebase Database y eliminándolos uno por uno. Esta es mi consulta y llamada.
let messagePhotoQuery = messagesRef.child(group.key).child("messages").queryOrdered(byChild: "photoURL")
deleteMessagePhotos(from: messagePhotoQuery)
Esta es mi función para obtener la URL y luego eliminar el archivo en esa referencia de almacenamiento.
func deleteMessagePhotos(from photoQuery: FIRDatabaseQuery) {
photoQuery.observeSingleEvent(of: .value, with: { (messagesSnapshot) in
guard messagesSnapshot.exists() else { return }
print(messagesSnapshot)
for message in messagesSnapshot.children {
let messageSnapshot = message as! FIRDataSnapshot
let messageData = messageSnapshot.value as! [String: AnyObject]
if let photoURL = messageData["photoURL"] as? String {
let photoStorageRef = FIRStorage.storage().reference(forURL: photoURL)
photoStorageRef.delete(completion: { (error) in
if let error = error {
print(error)
} else {
// success
print("deleted /(photoURL)")
}
})
}
}
})
}
Desde el contexto de una función segura de la nube de Google, puede eliminar un directorio completo utilizando el paquete npm de Google Cloud Storage (también conocido como API de Google Cloud Storage) de la siguiente manera:
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`);
}
});
más documentación disponible en documentos de la API de GCS
Parece que la única forma de eliminar un directorio es recorrer todos los archivos y eliminarlos uno por uno:
async function DeleteFirebaseStorageFolder(directoryName: string) {
const serviceAccount = require(''../secret/adminSdkPrivateKey.json'');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount),
storageBucket: ''gs://yourprojectname.appspot.com''
});
const bucket = admin.storage().bucket();
const files = (await bucket.getFiles({ directory: folderName }))[0];
const Deletions = [];
files.forEach(file => {
Deletions.push(bucket.file(file.name).delete());
})
await Promise.all(Deletions);
bucket.getFiles({ directory: folderName }).then((files) => {
console.log(''Remaining number of files: '' + (files[0].length).toString());
})
}
DeleteFirebaseStorageFolder(''myDirectoryName'');
del grupo de google, no es posible eliminar un directorio. Debe mantener una lista de archivos en algún lugar (en Firebase Database) y eliminarlos uno por uno.
https://groups.google.com/forum/#!topic/firebase-talk/aG7GSR7kVtw
También he enviado la solicitud de función, pero como su rastreador de errores no es público, no puedo compartir ningún enlace.