如何使用 node.js 删除 s3 上的文件夹?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/20207063/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-02 16:21:15  来源:igfitidea点击:

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

node.jsamazon-web-servicesamazon-s3

提问by user3034559

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.

是的我知道。s3 存储上没有文件夹概念。但我真的想用 node.js 从 s3 中删除一个特定的文件夹。我尝试了两种解决方案,但都不起作用。我的代码如下: 解决方案 1:直接删除文件夹。

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:

实际上,我在folder2下有很多文件。如果我定义这样的键,我可以从 folder2 中删除单个文件:var key='level/folder1/folder2/file1.txt',但是当我删除文件夹时它不起作用(key='level/folder1/folder2/ ')。解决方案 2:当我将此文件或文件夹上传到 s3 时,我尝试为对象设置过期时间。代码如下:

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?

如何使用 node.js 删除 s3 上的文件夹?

回答by Sangbeom Han

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 :

您可以使用 aws-sdk 模块删除文件夹。因为只有空的文件夹才能删除,所以应该先删除里面的文件。我这样做:

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

回答by Emi

Here is an implementation in ES7 with an asyncfunction and using listObjectsV2(the revised List Objects API):

这是 ES7 中的一个实现,带有一个async函数并使用listObjectsV2(修订后的 List Objects API):

async function emptyS3Directory(bucket, dir) {
    const listParams = {
        Bucket: bucket,
        Prefix: dir
    };

    const listedObjects = await s3.listObjectsV2(listParams).promise();

    if (listedObjects.Contents.length === 0) return;

    const deleteParams = {
        Bucket: bucket,
        Delete: { Objects: [] }
    };

    listedObjects.Contents.forEach(({ Key }) => {
        deleteParams.Delete.Objects.push({ Key });
    });

    await s3.deleteObjects(deleteParams).promise();

    if (listedObjects.IsTruncated) await emptyS3Directory(bucket, dir);
}

To call it:

调用它:

await emptyS3Directory(process.env.S3_BUCKET, 'images/')

回答by Nebojsa Sapic

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

回答by Bing Ren

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.

根据 Emi 的回答,我制作了一个 npm 包,因此您无需自己编写代码。代码也是用打字稿编写的。

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

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

回答by Alex Tamoykin

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 Commandeerso you can do it from a GUI. enter image description here

您可以像删除文件一样删除空文件夹。为了删除 AWS S3 上的非空文件夹,您需要先通过删除其中的所有文件和文件夹来清空它。文件夹为空后,您可以将其作为常规文件删除。这同样适用于桶删除。我们已经在这个名为Commandeer 的应用程序中实现了它,因此您可以从 GUI 执行它。 在此处输入图片说明