S3 中的“键”类似于文件路径:
http://bucket.s3.amazonaws.com/some/path/to/use
... 位于名为 bucket 的存储桶中,并且具有 some/path/to/use 的键。
它实际上不是路径,因为没有文件夹。 S3 密钥只是一个大目录(整个存储桶)中文件的文件名。 S3 密钥可以包含/,但没有特殊含义,除非您设置了delimiter argument with listing a bucket。
换句话说,拥有一个名为some/object 的对象并不能告诉您有关some 对象的任何信息(它可能存在也可能不存在——这两个对象不相关)。
但是,您可以请求带有特定前缀的密钥,所以我可以说“给我所有以 some/path/to/ 开头的密钥,它将返回 some/path/to/use。看起来像“列出目录”,但实际上只是在询问对于以特定字符串开头的文件。
我可以像这样轻松地命名:
somepathtousea
somepathtouseb
然后说“给我所有以somepathtouse 开头的东西”(它会说somepathtousea 和somepathtouseb)。
注意:S3 URL 来自 several forms:
http://s3.amazonaws.com/bucket/key
http://bucket.s3.amazonaws.com/key
http://bucket/key (where bucket is a DNS CNAME record pointing to bucket.s3.amazonaws.com)
编辑:
我查看了the JavaDocs,这是我看到的函数签名(AmazonS3Client):
public void deleteObject(java.lang.String bucketName,
java.lang.String key)
throws AmazonClientException,
AmazonServiceException
再次编辑:
文件夹现在确实存在,作为内容类型为application/x-directory 和以/ 结尾的键的零长度对象:
$ AWS_PROFILE=prod aws s3api head-object --bucket example-bucket --key example-directory/
{
"AcceptRanges": "bytes",
"LastModified": "Mon, 29 Apr 2019 14:59:36 GMT",
"ContentLength": 0,
"ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
"ContentType": "application/x-directory",
"ServerSideEncryption": "AES256",
"Metadata": {}
}
这仍然只是惯例,没有什么可以阻止您拥有以 / 结尾的文件或不存在的“文件夹”内的文件。