我有一个S3存储桶demo
,其中有一个对象demo/somefolder
。当我致电s3.doesObjectExists("demo", "somefolder")
时,它返回false。但是,当我调用s3.listObjects("demo", "somefolder")
时,返回的ObjectListing
引用了S3ObjectSummary
的列表。
关于这里发生的事情有什么想法吗?
答案 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
“文件夹”出现在控制台中,而无需首先创建类似于占位符文件夹的对象...因此存在是否存在这些对象对于桶中是否存在这样的“文件夹”没有意义。