繁体   English   中英

通过Java SDK和AWS控制台上传时不同的S3对象列表

[英]Different S3 object listing when uploading via Java SDK and AWS Console

我在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);

console*文件夹和文件是从Web控制台创建/上传的(单击每个文件夹的“ +创建文件夹”按钮,然后上传具有公共读取权限的文件)。

在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
        }
    ]
}

如果您喜欢控制台实现,则需要对其进行仿真。 这意味着您的SDK客户端需要在必要时创建中间“文件夹”。 您可以通过创建零大小的对象来实现此目的,这些对象的键以正斜杠结尾(如果这是您的“文件夹”分隔符)。

AWS控制台的行为方式如此,可让您创建“文件夹”,因为许多AWS控制台用户对文件夹和文件的概念比对对象(和键)更满意。

我认为很少需要这样做。 您的SDK客户端应实现为可以处理这些“文件夹”的存在与否。 更多信息在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM