AWS DELETE文件夹请求成功但文件夹仍然存在

时间:2016-02-20 22:04:39

标签: rest amazon-web-services amazon-s3

我有一个通过REST API与我的Amazon S3存储桶通信的应用程序。身份验证工作正常,我可以执行许多操作(例如,创建文件夹,上传文件,下载文件,GET对象)。

我还有一个问题:虽然我的REST请求删除文件夹成功(例如,AWS返回" 204 No Content"响应),"已删除"仍然可以通过AWS Web控制台访问该文件夹。

在发出DELETE请求之前,我可以通过AWS Web控制台看到该文件夹​​(及其子文件夹和文件)存在。我的存储桶版本已禁用。

现在,应用程序发出REST DELETE请求:

DELETE /App_Root/ HTTP/1.1
Accept: */*
User-Agent: libcurl/7.28.0 OpenSSL/0.9.8j App/2.1.105-Windows
Host: my-company-s3-account.s3.amazonaws.com
Date: Sat, 20 Feb 2016 18:24:08 +0000
Authorization: AWS [signed string]

以下是从Amazon S3收到的回复:

HTTP/1.1 204 No Content
x-amz-id-2: 6in0UAKZZWfgw2ifNhLVT8+UhNLGAo/8948L2SUqhg/OB5agr6X8q8ceQ/3Z4emO4n/XgfXqIUo=
x-amz-request-id: 42802B620F593699
Date: Sat, 20 Feb 2016 18:23:44 GMT
Server: AmazonS3

刷新AWS Web控制台显示已删除的文件夹仍然存在。向Amazon S3发出另一个GET对象请求显示文件夹和文件仍然存在。

我错过了什么吗?

1 个答案:

答案 0 :(得分:7)

您错过了S3中实际上不存在文件夹的事实。

看起来像文件夹的所有内容只是控制台提供的一种方便的错觉,基于对象键中的/分隔符。

  

Amazon S3数据模型本身不支持文件夹的概念,也不提供任何用于文件夹级操作的API。但Amazon S3控制台支持文件夹以帮助您组织数据。

     

- http://docs.aws.amazon.com/AmazonS3/latest/UG/about-using-console.html

要使用API​​删除“文件夹”,您必须删除看似“在”中的对象。

那么,为什么不在代码中出错?

那是因为DELETE REST动词是幂等的。在删除请求之后,您删除的路径中没有对象,因此,从技术上讲,您“成功”,无论您删除了多少次,无论是否存在,操作都会成功。

控制台仍显示一个文件夹,因为该对象具有该前缀,仍在存储桶中。

当您从控制台删除文件夹时,控制台会通过发送一个或多个其他删除基础对象的请求来处理“包含”对象的实际删除。

另请注意,在使用API​​将对象“存储”之前,无需创建文件夹。如果您只在密钥中创建一个带有/斜杠的对象,它将隐式出现在控制台中。