ios swift firebase firebase-storage

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:

  1. Elimina la carpeta en Firebase Database que contiene la lista de modelos
  2. Escuche la eliminación de esa carpeta a través de las funciones de Firebase
  3. 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.