2016-06-10 3 views
7

FirebaseStorage всегда возвращает ошибку 400 при попытке удалить каталог, то есть что-то вроде следующего всегда возвращает ошибку 400.FirebaseStorage: Как удалить каталог

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

Однако удаление файла прекрасно работает, например. что-то вроде не возвращает ошибку:

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

Что я могу делать неправильно здесь? Я не считаю, что это не поддерживается FirebaseStorage, потому что удаление файлов из каталога один за другим было бы довольно хромым (особенно если указанная директория имеет 100 или 1000).

ответ

11

из группы google, удаление каталога невозможно. Вы должны хранить список файлов где-нибудь (в базе данных Firebase) и удалять их один за другим.

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

Я также представил запрос функции, но так как их ошибка трекер не является общедоступным, нет никакой связи, что я мог бы поделиться.

+1

Почему Google. Просто ... Почему? – Ruan

0

In 26/5/2017 there is no way to delete directory But you can use my algorithm

Используйте этот код.

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); 

    }); 


    } 
0

Как указано выше, удаление каталога недопустимо. Я использую пример запроса списка файлов в базе данных Firebase и их удаления один за другим. Это мой запрос и вызов.

let messagePhotoQuery = messagesRef.child(group.key).child("messages").queryOrdered(byChild: "photoURL") 
    deleteMessagePhotos(from: messagePhotoQuery) 

Это моя функция, проходящая через получение URL-адреса, а затем удаление файла по этой ссылке на хранилище.

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)") 
        } 
       }) 
      } 
     } 
    }) 
} 
Смежные вопросы