我使用没有任何分隔符的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”。有许多具有相同问题的S3Object。为什么会这样?
答案 0 :(得分:3)
原因是S3实际上具有扁平结构。没有文件夹,但它只识别正斜杠,因此将具有相同前缀的文件分组在同一文件夹下。所以在你的例子中,“/ BF / MUSIC”只是另一个对象,而不是一个空文件夹。
在Amazon S3中,存储桶和对象是主要资源,其中 对象存储在存储桶中。亚马逊S3的结构扁平,没有 您将在典型的文件系统中看到的层次结构。但是,对于 为了简化组织,Amazon S3控制台支持 文件夹概念作为分组对象的一种手段。 Amazon S3就是这么做的 通过使用对象的密钥名称前缀。
答案 1 :(得分:1)
在尝试使用 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 但不提供缓冲区,并使用 Key 之类的东西
/createdFolder/newFolder/
当使用上述提供的方式创建文件夹时,ListObjects 将对象作为单独的对象返回。