使用aws-sdk在Amazon S3上删除Nodejs文件夹

3
我遇到了删除Amazon S3中包含照片文件夹的问题。
1. 创建文件夹。
var params = {Bucket: S3_BUCKET, Key: "test/", ACL:"public-read"};  
s3.putObject(params, function(err, data) {  

}); 

2. 上传照片

var body = fs.createReadStream(filePath);  
var params = {Bucket: S3_BUCKET, Key: "test/flower.jpgg", Body: body, ContentType:"image/jpeg", ACL:"public-read"};  

s3.upload(params, function(err, data) {

});

3. 删除文件夹

var params = {Bucket: S3_BUCKET, Key: "test/"};  
s3.deleteObject(params, function(err, data) {

});

如果文件夹中没有照片,删除功能可以正常工作。但是如果包含照片,则无法删除。
请帮忙解决。谢谢所有支持。

AWS系统可能会记录此事,但这可能与目录中已有的项目有关。您需要删除文件夹的内容,然后删除文件夹(Bucket?)。如果您不确定如何操作,我可以查找S3命令。 - Dandy
老兄,我只想用一个命令删除文件夹及其内部所有内容。如果没有此类命令支持,我将尝试删除所有内容,然后再删除文件夹。 - Vu Thai Duy
出于安全考虑,我建议采用后者。您不希望意外删除重要的内容。 - Dandy
1个回答

9
问题在于这是一个概念性的问题,起源于第一步。这并不会创建文件夹,而是创建了一个占位对象,控制台将其显示为文件夹。
以"/"结尾命名的对象在Amazon S3控制台中显示为文件夹。 http://docs.aws.amazon.com/AmazonS3/latest/UG/FolderOperations.html 没有必要这样做——即使没有创建此对象,使用该键前缀创建对象仍将使控制台显示文件夹。同一页:
“Amazon S3没有像Typical文件系统中看到的层次结构”。但是,为了组织上的简单性,Amazon S3控制台支持文件夹的概念作为分组对象的一种方式。Amazon S3通过为对象使用键名称前缀来做到这一点。
因此,在第一步,您实际上并没有创建文件夹,因此删除占位对象也不会删除文件夹,这是有道理的。
S3中实际上不存在文件夹——它们只用于控制台的显示目的——因此,不能正确地说对象“在”文件夹中。唯一的方法是逐个显式删除对象以删除所有“在”文件夹中的对象。同样,重命名文件夹的唯一方法是重命名其中的对象……而重命名对象的唯一方法是复制具有新键的对象,然后删除旧对象。

感谢Michael进行详细的解释。 - Vu Thai Duy
s3.deleteObjects会在删除文件夹对象之前简化删除所有照片的过程。 - Vu Thai Duy
是的,我假设deleteObjects使用多删除API,因此它比单个删除请求更快,更有效。从我的回答中的意义上来说,这仍然是“逐个”删除对象,因为仍然需要指定对象。另外,请注意根本不需要创建该文件夹对象。 - Michael - sqlbot
那么键应该是folderNameShown%filename.extension。 - Naveen Vignesh
1
我花了一些时间才弄清楚这个问题。我创建了一个repl来展示我是如何做到的https://repl.it/@DrwHarris/Delete-S3-Folder。希望能帮助其他人。 - Andrew Harris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接