【问题标题】:AWS S3 - ListObjects returns incomplete directory listingsAWS S3 - ListObjects 返回不完整的目录列表
【发布时间】:2016-02-07 12:19:05
【问题描述】:

我使用没有任何分隔符的 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 有同样的问题。为什么会这样?

【问题讨论】:

    标签: c# amazon-web-services amazon-s3 aws-sdk


    【解决方案1】:

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

    在 Amazon S3 中,存储桶和对象是主要资源,其中 对象存储在桶中。 Amazon S3 具有扁平结构,没有 像您在典型文件系统中看到的层次结构。然而,对于 为了组织简单,Amazon S3 控制台支持 文件夹概念作为对对象进行分组的一种方式。 Amazon S3 执行此操作 通过使用对象的键名前缀。

    来源:AWS Documentation: Working with Folders

    【讨论】:

    • 我需要为存储桶编写文件夹资源管理器之类的东西,您知道如何获取路径,例如:“/BF/MUSIC”使用 ListObjects 或其他东西吗?
    • 我不知道。您可能需要提出自己的算法,例如将 / 之前的所有内容视为子文件夹并跟踪它们以对对象进行分组。
    • @neustart47 这就是delimiter 的用途。它在响应 XML 中返回 <CommonPrefixes> 中的“文件夹”。
    【解决方案2】:

    当我尝试使用 AWS SDK ListObjectsListObjectV2 同步 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 将对象作为单独的对象返回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-25
      • 2019-01-19
      • 2012-04-14
      • 1970-01-01
      相关资源
      最近更新 更多