ios - FirebaseStorage: निर्देशिका को हटाने के लिए कैसे




swift firebase-storage (5)

जब मैं किसी निर्देशिका को हटाने का प्रयास करता हूं, तो FirebaseStorage हमेशा 400 त्रुटि देता है यानी निम्नलिखित हमेशा की तरह त्रुटि 400

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 या अधिक है)।


26/5/2017 में निर्देशिका को हटाने का कोई तरीका नहीं है लेकिन आप मेरे एल्गोरिथ्म का उपयोग कर सकते हैं

इस कोड का उपयोग करें।

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

    });


  }

Google समूह से, निर्देशिका हटाना संभव नहीं है। आपको फ़ाइलों की सूची कहीं न कहीं (फायरबेस डेटाबेस में) रखनी होगी और उन्हें एक-एक करके हटाना होगा।

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

मैंने सुविधा अनुरोध भी प्रस्तुत किया है, लेकिन चूंकि उनका बग ट्रैकर सार्वजनिक नहीं है, इसलिए कोई लिंक नहीं है जिसे मैं साझा कर सकता हूं।


ऐसा लगता है कि एक निर्देशिका को हटाने का एकमात्र तरीका सभी फाइलों के माध्यम से लूप करना और उन्हें एक-एक करके हटाना है:

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

जुलाई 2019 तक, आप एक फ़ोल्डर को सूचीबद्ध कर सकते हैं, और इसकी सामग्री को पुन: हटा सकते हैं:

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

यहाँ Firebase फ़ंक्शंस का उपयोग करके Firebase Storage में एक फ़ोल्डर में फ़ाइलों को हटाने का एक समाधान है।

यह मानता है कि आपके Firebase डेटाबेस में / MyStorageFilesInDatabaseTrackedHere / path1 / path2 के तहत संग्रहीत मॉडल हैं।

उन मॉडलों में एक फ़ील्ड होगा जिसका नाम "फ़ाइलनाम" होगा जिसमें फ़ाइल का नाम फायरबेस स्टोरेज में होगा।

वर्कफ़्लो है:

  1. फायरबेस डेटाबेस में फ़ोल्डर को हटा दें जिसमें मॉडल की सूची है
  2. फायरबेस फ़ंक्शंस के माध्यम से उस फ़ोल्डर को हटाने के लिए सुनो
  3. यह फ़ंक्शन फ़ोल्डर के बच्चों पर लूप करेगा, फ़ाइल नाम प्राप्त करेगा और इसे स्टोरेज में हटा देगा।

(डिस्क्लेमर: स्टोरेज में फ़ोल्डर अभी भी इस फ़ंक्शन के अंत में बचा हुआ है इसलिए इसे हटाने के लिए एक और कॉल करने की आवश्यकता है)।

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




firebase-storage