How can I delete folder on s3 with node.js?

后端 未结 7 931
误落风尘
误落风尘 2021-01-30 10:48

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

相关标签:
7条回答
  • 2021-01-30 10:58

    You can try this:

    import { s3DeleteDir } from '@zvs001/s3-utils'
    import { S3 } from 'aws-sdk'
    
    const s3Client = new S3() 
    
    await s3DeleteDir(s3Client, {
      Bucket: 'my-bucket',
      Prefix: `folder/`,
    })
    
    0 讨论(0)
  • 2021-01-30 11:00

    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.Contents.length == 1000)emptyBucket(bucketName,callback);
          else callback();
        });
      });
    }
    
    0 讨论(0)
  • 2021-01-30 11:10

    You can delete an empty folder the same way you delete a file. In order to delete a non-empty folder on AWS S3, you'll need to empty it first by deleting all files and folders inside. Once the folder is empty, you can delete it as a regular file. The same applies to the bucket deletion. We've implemented it in this app called Commandeer so you can do it from a GUI.

    0 讨论(0)
  • 2021-01-30 11:12

    The accepted answer throws an error when used in typescript, and it is do Objects array in deleteParams. I made it work by modifying the code in the following way. I'm very new to Typescript but at least it is working now.

     async function emptyS3Directory(prefix: string) {
      const listParams = {
        Bucket: "bucketName",
        Prefix: prefix, // ex. path/to/folder
      };
    
      const listedObjects = await s3.listObjectsV2(listParams).promise();
    
      if (listedObjects.Contents.length === 0) return;
    
      const deleteParams = {
        Bucket: bucketName,
        Delete: { Objects: [] as any },
      };
    
      listedObjects.Contents.forEach((content: any) => {
        deleteParams.Delete.Objects.push({ Key: content.Key });
      });
    
      await s3.deleteObjects(deleteParams).promise();
    
      if (listedObjects.IsTruncated) await emptyS3Directory(prefix);
    }
    
    0 讨论(0)
  • 2021-01-30 11:13

    According to accepted answer I created promise returned function, so you can chain it.

    function emptyBucket(bucketName){
        let currentData;
        let params = {
            Bucket: bucketName,
            Prefix: 'folder/'
        };
    
        return S3.listObjects(params).promise().then(data => {
            if (data.Contents.length === 0) {
                throw new Error('List of objects empty.');
            }
    
            currentData = data;
    
            params = {Bucket: bucketName};
            params.Delete = {Objects:[]};
    
            currentData.Contents.forEach(content => {
                params.Delete.Objects.push({Key: content.Key});
            });
    
            return S3.deleteObjects(params).promise();
        }).then(() => {
            if (currentData.Contents.length === 1000) {
                emptyBucket(bucketName, callback);
            } else {
                return true;
            }
        });
    }
    
    0 讨论(0)
  • 2021-01-30 11:16

    According to Emi's answer I made a npm package so you don' t need to write the code yourself. Also the code is written in typescript.

    See https://github.com/bingtimren/s3-commons/blob/master/src/lib/deleteRecursive.ts

    0 讨论(0)
提交回复
热议问题