如何使用 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
How can I delete folder on s3 with node.js?
提问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.

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


