Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Java SDK和AWS控制台上载时不同的S3对象列表_Java_Amazon Web Services_Amazon S3_Aws Java Sdk - Fatal编程技术网

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

通过Java SDK和AWS控制台上载时不同的S3对象列表,java,amazon-web-services,amazon-s3,aws-java-sdk,Java,Amazon Web Services,Amazon S3,Aws Java Sdk,我在S3中有一个bucket,其结构和内容如下: javaFolderA/ └── javaFolderB/ └── javaFile.tmp consoleFolderA/ └── consoleFolderB/ └── consoleFile.tmp java*文件夹和文件通过java SDK上传: final File file = new File("C:\\javaFolderA\\javaFolderB\\javaFile.tmp"); client.putObje

我在S3中有一个bucket,其结构和内容如下:

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控制台中,单击创建新bucket后,将显示以下消息:

当您创建文件夹时,S3控制台将创建一个具有上述名称并附加后缀/的对象,并且该对象将在S3控制台中显示为文件夹

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

控制台文件夹/ 控制台文件夹A/控制台文件夹B/ consoleFolderA/consoleFolderB/consoleFile.tmp t SDK上载的结果是一个具有键的单个对象:javaFolderA/javaFolderB/javaFile.tmp。这是有道理的,因为我们只放置一个对象,而不是三个。但是,在列出bucket的内容时,这会导致不一致。尽管每个目录中只有一个实际文件,但对于控制台场景,列出内容会返回多个文件

我的问题是为什么会出现这种情况,我如何才能实现一致的行为?似乎没有办法通过带引号的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客户端应该实现为处理这些“文件夹”的存在和不存在。更多信息。

谢谢您的建议。我同意我不应该走那条路。由于它们在web控制台上看起来完全相同,因此必须解决这一令人沮丧的细微差别。在我的例子中,我希望使用ObjectListing上的getObjectSummaries和getCommonPrefixes方法来确定文件与“文件夹”的对比。听起来这并不是那么简单,我必须更加小心地处理如何发出listObjects请求和解释结果。或者你可以直接调用listObjects。这将为您提供所有对象,其中一些是文件夹。过滤结果,以便将以/结尾的零大小对象推送到文件夹hashmap/字典中,然后对其余对象进行迭代,使用路径实用程序函数将对象键分解为组成文件夹,然后将它们推送到文件夹hashmap/字典中。这将为您提供一个文件列表,与真实文件夹和隐含文件夹的映射/目录分开。好主意-我喜欢这样。再次感谢!