首页 文章

通过Java SDK和AWS Console上传时,不同的S3对象列表

提问于
浏览
0

我在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控制台创建/上传的(单击每个文件夹的"+ Create folder"按钮,然后使用公共读取权限上载文件) .

在Web控制台中,单击以创建新存储桶后,将显示以下消息:

创建文件夹时,S3控制台会创建一个上面带有后缀“/”的对象,该对象在S3控制台中显示为文件夹 .

因此,正如预期的那样,通过上面的文件夹和文件,我们可以使用以下键在存储桶中创建3个对象:

  • consoleFolderA/

  • consoleFolderA/consoleFolderB/

  • consoleFolderA/consoleFolderB/consoleFile.tmp

SDK上传的结果是一个带有密钥的对象: javaFolderA/javaFolderB/javaFile.tmp . 这是有道理的,因为我们只放一个对象,而不是三个 . 但是,这会导致列出存储桶内容时出现不一致 . 即使每个目录中只有一个实际文件,列出内容也会为控制台方案返回多个文件 .

我的问题是 why is this the casehow can I achieve consistent behavior ?实际上没有't seem to be a way to 2769424 via the SDK (In quotes because I know there aren' t文件夹/目录) .

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

1 回答

  • 1

    如果您更喜欢控制台实现,那么您需要模拟它 . 这意味着您的SDK客户端需要在必要时创建中间“文件夹” . 您可以通过创建零大小的对象来实现此操作,这些对象的键以正斜杠结束(如果这是您的'文件夹'分隔符) .

    AWS控制台以这种方式运行,允许您创建“文件夹”,因为许多AWS控制台用户对文件夹和文件的概念比对象(和密钥)更容易理解 .

    它's rare, in my opinion, to need to do this, however. Your SDK clients should be implemented to handle both the presence and absence of these '文件夹' . 更多信息here .

相关问题