node.jsamazon-web-servicesamazon-s3

How can I delete folder on S3 with Node.js?


Yes, I know. There is no folder concept on S3 storage. but I really want to delete a specific folder from S3 with Node.js. I tried two solutions, but both didn't work. My code is below:

Solution 1

Deleting folder directly.

var key='level/folder1/folder2/';
var strReturn;
        var params = {Bucket: MyBucket};
        var s3 = new AWS.S3(params);
        s3.client.listObjects({
            Bucket: MyBucket,
            Key: key
        }, function (err, data) {
            if(err){
                strReturn="{\"status\":\"1\"}";
                
            }else{
                strReturn=+"{\"status\":\"0\"}";
            }
            res.send(returnJson);
            console.log('error:'+err+' data:'+JSON.stringify(data));
        });

Actually, I have a lot of files under folder2. I can delete single file from folder2 if I define key like this: var key='level/folder1/folder2/file1.txt', but it didn't work when I deleted a folder (key='level/folder1/folder2/').

Solution 2

I tried to set expiration to an object when I uploaded this file or folder to s3. code is below:

s3.client.putObject({
                Bucket: Camera_Bucket,
                Key: key,
                            ACL:'public-read', 
                Expires: 60 
            }

But it didn't either. After finishing uploading, I checked the properties of that file. It showed there was nothing value for expiry date:

Expiry Date:none
Expiration Rule:N/A

How can I delete folder on S3 with Node.js?


Solution

  • You can use aws-sdk module for deleting folder. Because you can only delete a folder when it is empty, you should first delete the files in it. I'm doing it like this :

    function emptyBucket(bucketName,callback){
      var params = {
        Bucket: bucketName,
        Prefix: 'folder/'
      };
    
      s3.listObjects(params, function(err, data) {
        if (err) return callback(err);
    
        if (data.Contents.length == 0) callback();
    
        params = {Bucket: bucketName};
        params.Delete = {Objects:[]};
        
        data.Contents.forEach(function(content) {
          params.Delete.Objects.push({Key: content.Key});
        });
    
        s3.deleteObjects(params, function(err, data) {
          if (err) return callback(err);
          if (data.IsTruncated) {
            emptyBucket(bucketName, callback);
          } else {
            callback();
          }
        });
      });
    }