AWS S3-ListObjects返回不完整的目录列表

本文关键字:列表 S3-ListObjects 返回 AWS | 更新日期: 2023-09-27 18:20:46

我使用了不带任何分隔符的ListObject函数,结果得到了如下结果:

/BF
/BF/FTP
/BF/MUSIC/LIBRARY/AUDITION/BEAKING%20EARLY.MP3
/BF/VIDEO/
/BF/VIDEO/Example
/BF/VIDEO/Example/test.mp4

问题出在音乐文件夹中。为什么ListObjects不返回键为"的S3Object/BF/MUSIC";。有许多S3Objects存在相同的问题。为什么会发生这种情况?

AWS S3-ListObjects返回不完整的目录列表

原因是S3实际上具有扁平结构。并没有文件夹,但它只识别正向斜杠,所以将具有相同前缀的文件夹分组在同一文件夹下。因此,在您的示例中,"/BF/MUSIC"将只是另一个对象,而不是一个空文件夹。

在AmazonS3中,bucket和object是主要资源,其中对象存储在存储桶中。Amazon S3具有扁平结构,没有层次结构,就像您在典型的文件系统中看到的那样。然而,对于为了简化组织,AmazonS3控制台支持文件夹概念作为对对象进行分组的一种方式。亚马逊S3做到了通过对对象使用关键字名称前缀。

来源:AWS文档:使用文件夹

当我尝试使用AWS SDK ListObjects或ListObjectV2同步S3存储桶中的文件夹和文件时,我也遇到了类似的问题。

就我而言,原因与文件上传过程有关。例如,当我创建一个文件夹并将文件上传到创建的文件夹时,我可以接收两个对象(文件夹和文件)。

/createdFolder
/createdFoder/example.pdf

但是,当我使用AWS SDK PutObject上传文件,并训练将文件上传到不存在的目录时,使用密钥,例如

/createdFoder/folder1/folder2/example.pdf

上传后,在训练获取对象列表时,我看不到以下对象

/createdFoder/folder1
/createdFoder/folder1/folder2

它只返回/createdFoder/folder1/folder2/example.pdf

在我的案例中,作为一个解决方案,我使用HeadObject添加了验证和检查文件夹是否存在。如果返回404状态,则表示文件夹不存在。

重要提示:如果您使用的是HeadObject,则需要Key参数的最后一个/。例如,密钥看起来像/createdFoder/folder1/

我还添加了添加文件夹的功能。使用相同的PutObject,但不提供缓冲区,并使用类似的密钥

/createdFolder/newFolder/

当使用上面提供的方法创建文件夹时,ListObjects将对象作为一个单独的对象返回。