【问题标题】:Nodejs delete folder on Amazon S3 with aws-sdkNodejs 使用 aws-sdk 删除 Amazon S3 上的文件夹
【发布时间】:2021-10-21 18:03:39
【问题描述】:

我面临删除 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,我只想通过一个命令删除包含所有内容的文件夹。如果没有命令支持,我会尝试删除所有内容然后删除文件夹。
  • 出于安全原因,无论如何我都推荐后者。您不想意外删除重要的内容。

标签: node.js amazon-web-services amazon-s3


【解决方案1】:

这里的问题是一个概念问题,从第一步开始。

这不会创建文件夹。它创建一个占位符对象,控制台将显示为文件夹。

以结尾“/”命名的对象在 Amazon S3 控制台中显示为文件夹。

http://docs.aws.amazon.com/AmazonS3/latest/UG/FolderOperations.html

没有必要这样做——用这个键前缀创建对象仍然会导致控制台显示一个文件夹,即使没有创建这个对象。来自同一页面:

Amazon S3 具有扁平结构,没有您在典型文件系统中看到的层次结构。但是,为了组织简单,Amazon S3 控制台支持将文件夹概念作为对对象进行分组的一种方式。 Amazon S3 通过使用对象的键名前缀来做到这一点。

由于在第 1 步中,您实际上并没有创建文件夹,因此删除占位符对象也不会删除文件夹是有意义的。

文件夹实际上并不存在于 S3 中——它们仅用于控制台中的显示目的——因此不能正确地将对象称为“在”文件夹中。删除文件夹“中”所有对象的唯一方法是单独显式删除对象。同样,重命名文件夹的唯一方法是重命名其中的对象……而重命名对象的唯一方法是使用新键创建对象的副本,然后删除旧对象。

【讨论】:

  • 感谢迈克尔的详细解释。
  • s3.deleteObjects 将简化删除文件夹对象之前删除所有照片。
  • 是的,我假设deleteObjects 使用multi-delete API,因此它比单独的删除请求更快、更有效。就我在答案中的意图而言,这仍然是“单独”删除对象,因为仍然需要指定对象。另外,请注意根本不需要创建该文件夹对象。
  • 所以key应该是folderNameShown%filename.extension
  • 我花了一段时间才弄明白。我把一个 repl 放在一起来展示我是如何做到这一点的repl.it/@DrwHarris/Delete-S3-Folder。希望它可以帮助其他人。
猜你喜欢
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
  • 2012-04-07
  • 1970-01-01
  • 2016-01-06
  • 2020-11-02
  • 2021-04-24
  • 2019-07-22
相关资源
最近更新 更多