我在S3中有一个带有以下结构和内容的存储桶:
javaFolderA/
└── javaFolderB/
└── javaFile.tmp
consoleFolderA/
└── consoleFolderB/
└── consoleFile.tmp
java*
文件夹和文件是通过Java SDK上传的:
final File file = new File("C:\\javaFolderA\\javaFolderB\\javaFile.tmp");
client.putObject("testbucket", "javaFolderA/javaFolderB/javaFile.tmp", file);
从Web控制台创建/上传console*
个文件夹和文件(单击每个文件夹的" +创建文件夹"按钮,然后使用公共读取权限上传文件)。
在Web控制台中,单击以创建新存储桶后,将显示以下消息:
创建文件夹时,S3控制台会创建一个对象,其上面的名称后缀为" /"该对象在S3控制台中显示为文件夹。
因此,正如预期的那样,通过上面的文件夹和文件,我们可以使用以下键在存储桶中创建3个对象:
consoleFolderA/
consoleFolderA/consoleFolderB/
consoleFolderA/consoleFolderB/consoleFile.tmp
SDK上传的结果是一个对象,其中包含密钥:javaFolderA/javaFolderB/javaFile.tmp
。这是有道理的,因为我们只放一个对象,而不是三个。但是,这会导致列出存储桶内容时出现不一致。即使每个目录中只有一个实际文件,列出内容也会为控制台方案返回多个文件。
我的问题是为什么会出现这种情况,如何实现一致行为?似乎没有一种方法来上传目录"通过SDK(引号中,因为我知道有实际文件夹/目录)。
从CLI我可以验证对象的数量及其键:
C:\Users\avojak>aws s3api list-objects --bucket testbucket
{
"Contents": [
{
"LastModified": "2018-01-02T22:43:55.000Z",
"ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
"StorageClass": "STANDARD",
"Key": "consoleFolderA/",
"Owner": {
"DisplayName": "foo.bar",
"ID": "2c401638471162eda7a3b48e41dfb9261d9022b56ce6b00c0ecf544b3e99ca93"
},
"Size": 0
},
{
"LastModified": "2018-01-02T22:44:02.000Z",
"ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
"StorageClass": "STANDARD",
"Key": "consoleFolderA/consoleFolderB/",
"Owner": {
"DisplayName": "foo.bar",
"ID": "2c401638471162eda7a3b48e41dfb9261d9022b56ce6b00c0ecf544b3e99ca93"
},
"Size": 0
},
{
"LastModified": "2018-01-02T22:44:16.000Z",
"ETag": "\"968fe74fc49094990b0b5c42fc94de19\"",
"StorageClass": "STANDARD",
"Key": "consoleFolderA/consoleFolderB/consoleFile.tmp",
"Owner": {
"DisplayName": "foo.bar",
"ID": "2c401638471162eda7a3b48e41dfb9261d9022b56ce6b00c0ecf544b3e99ca93"
},
"Size": 69014
},
{
"LastModified": "2018-01-02T22:53:13.000Z",
"ETag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
"StorageClass": "STANDARD",
"Key": "javaFolderA/javaFolderB/javaFile.tmp",
"Owner": {
"DisplayName": "foo.bar",
"ID": "2c401638471162eda7a3b48e41dfb9261d9022b56ce6b00c0ecf544b3e99ca93"
},
"Size": 0
}
]
}
答案 0 :(得分:1)
如果您更喜欢控制台实现,那么您需要模拟它。这意味着您的SDK客户端需要在必要时创建中间文件夹“#”。您可以通过创建零大小的对象来实现此操作,这些对象的键以正斜杠结束(如果这是您的'文件夹'分隔符)。
AWS控制台以这种方式运行,允许您创建文件夹',因为许多AWS控制台用户对文件夹和文件的概念比对象(和密钥)更为舒适。
但是,在我看来,很少需要这样做。应该实现您的SDK客户端以处理这些文件夹的存在和不存在'。更多信息here。