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

新手上路,请多包涵

是的,我知道。 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));
        });

实际上,我在文件夹 2 下有很多文件。如果我定义这样的键,我可以从文件夹 2 中删除单个文件: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
            }

但它也没有。上传完成后,我检查了该文件的属性。它表明到期日期没有任何价值:

 Expiry Date:none
Expiration Rule:N/A

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

原文由 user3034559 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

您可以使用 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.IsTruncated) {
        emptyBucket(bucketName, callback);
      } else {
        callback();
      }
    });
  });
}

原文由 Sangbeom Han 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是 ES7 中的一个实现,带有 async 函数并使用 listObjectsV2 (修改后的列表对象 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);
}

调用它:

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

原文由 Emi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题