是的,我知道。 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));
});
其实我在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
}
但它也没有。上传完成后,我检查了该文件的属性。它表明到期日期没有任何值(value):
Expiry Date:none
Expiration Rule:N/A
如何使用 node.js 删除 s3 上的文件夹?
最佳答案
这是 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);
}
调用它:
await emptyS3Directory(process.env.S3_BUCKET, 'images/')
关于node.js - 如何使用 node.js 删除 s3 上的文件夹?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20207063/