为什么ObjectExist和listObjects在S3的Java API上不一致?

时间:2019-02-09 21:16:37

标签: amazon-s3 aws-sdk

我有一个S3存储桶demo,其中有一个对象demo/somefolder。当我致电s3.doesObjectExists("demo", "somefolder")时,它返回false。但是,当我调用s3.listObjects("demo", "somefolder")时,返回的ObjectListing引用了S3ObjectSummary的列表。

关于这里发生的事情有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我从名称somefolder出发,假设您描述的“对象”是“文件夹”而不是文件。

doesObjectExist(String bucketName, String objectName) 

这将测试键为objectName的特定对象。

listObjects(String bucketName, String prefix)

这将返回其键以prefix开头的所有对象的列表。

这是两个完全不同的测试。

如果是使用S3控制台创建的文件夹 ,则s3.doesObjectExists("demo", "somefolder/")是正确的-注意尾部有斜杠-但在S3中是“文件夹”并不作为有意义的实体存在,并且实际上不是s3.doesObjectExist()的有效使用。

控制台仅出于以下一个原因显示文件夹somefolder:因为存储桶中存在一个或多个对象,且键前缀为somefolder/。但是为了方便在没有结构的存储桶中导航,控制台允许您通过“创建文件夹”来创建结构的外观...实际上创建了一个0字节的对象,并将/附加到任何内容的末尾您提供的名称(但控制台会隐藏该对象本身的显示)。  这些对象仅用于控制台导航。以编程方式上传的具有键pics/cat.jpg的对象仍将导致pics“文件夹”出现在控制台中,而无需首先创建类似于占位符文件夹的对象...因此存在是否存在这些对象对于桶中是否存在这样的“文件夹”没有意义。