Delete Folder from Firebase Storage using Google Cloud Storage

后端 未结 2 1831
名媛妹妹
名媛妹妹 2021-01-14 05:19

I want to delete the folder \"test\" and everything that is in it.

I am sucessfuly able to delete the folder and all it\'s contents/subfolders in FirebaseStorage wit

相关标签:
2条回答
  • 2021-01-14 06:05

    I posted a possible solution over at https://stackoverflow.com/a/52580756/4752490 and will post it here too.

    Here is one solution to delete files in a folder in Firebase Storage using Firebase Functions.

    It assumes you have models stored under /MyStorageFilesInDatabaseTrackedHere/path1/path2 in your Firebase Database.

    Those models will have a field named "filename" which will have the name of the file in Firebase Storage.

    The workflow is:

    1. Delete the folder in Firebase Database that contains the list of models
    2. Listen for the deletion of that folder via Firebase Functions
    3. This function will loop over the children of the folder, obtain the filename and delete it in Storage.

    (Disclaimer: the folder in Storage is still leftover at the end of this function so another call needs to be made to remove it.)

    // 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);
    });
    
    0 讨论(0)
  • 2021-01-14 06:08

    Buckets are the basic containers that hold your data. You have a bucket with name "bucketname.appspot.com". "bucketname.appspot.com/test" is your bucket name plus a folder, so its not a valid name of your bucket. By calling bucket.delete(...) you can delete only the whole bucket, but you cannot delete a folder in a bucket. Use GcsService to delete files or folders.

    String bucketName = "bucketname.appspot.com";
    GcsService gcsService = GcsServiceFactory.createGcsService(RetryParams.getDefaultInstance());
    gcsService.delete(new GcsFilename(bucketName, "test"));
    
    0 讨论(0)
提交回复
热议问题