4

我有一个观察结果可能会帮助其他使用 S3 的人以及下面的一个问题。此处的示例代码在 Groovy 中使用 JetS3t Java lib,但这些概念适用于任何编程语言。

我在 Slashdot 和其他地方发现了很多文档,声称 S3 在存储桶中没有子目录的概念。这大多是真的。当您要删除文件时,您会发现必须首先使用以下方法找到它们:

  //assume we are looking for all files in 'stuff' directory
  files = s3.listObjects(bucket, 'stuff/', null)

现在,如果您删除这些文件,您仍然会留下一些看起来非常像存储桶中的子目录的东西。您仍然会看到列出的“东西/”。所以这让我质疑是否真的没有子目录。事实证明确实没有真正的子目录,但是某些文件伪装成子目录并显示在列表中。经过一番探索,我确定这是另一个 S3 对象,其键名带有附加到键的特殊字符串 _$folder$。因此,您可以通过执行以下操作来删除它(假设上面的示例):

   s3.deleteObject(bucket, 'stuff_$folder$')

现在,您将不再看到为该存储桶中的内容列出的任何子目录。虽然我没有对此进行测试,但我认为在尝试删除密钥“stuff_$folder$”之前,东西/文件夹必须已经为空。令我吃惊的是,在这里的所有帖子中都没有提到这一点,因此任何试图删除整个子目录的人都可能让子目录本身仍然存在!

如果你回到我原来的 listObjects 调用并改为这样做:

   files = s3.listObjects(bucket, 'stuff', null) //note, no trailing slash

您将看到结果中返回的 stuff_$folder$。我的问题是您可能还会获得其他以“stuff”键开头但不包含在“子目录”中的对象。所以你必须小心。所以我的偏好是将“stuff/”作为键传递,然后分别处理“stuff_$folder_”对象。

这引出了最后一个问题。我似乎无法清楚地解释 listObjects(bucket, key, delimiter) 调用中的最终参数的含义。究竟什么是“分隔符”。它似乎并不意味着“文件分隔符”(如'/')。我已经搜索过,似乎找不到一个例子来说明这意味着什么或它是如何使用的。我想知道,因为是否有任何方法可以提高我想知道的 listObjects 的实用性和灵活性。有人可以提供一个示例来说明 delimiter 参数的用法和含义吗?我确定它很简单,但我找不到一个很好的例子。

4

1 回答 1

1

定界符是一个笨拙的名字。如果您将其视为后缀,则更有意义。从 S3 文档 - http://aws.amazon.com/releasenotes/Amazon-S3/213或者如果您更喜欢稍微不同的解释http://www.bucketexplorer.com/documentation/amazon-s3--search-on -objects-in-bucket.html

共享由特殊分隔符终止的公共前缀的键组现在可以按该前缀进行汇总,以便列出。这允许应用程序分层浏览其密钥,就像您在文件系统中浏览目录的方式一样。

例如,如果您有一个包含以下键的存储桶(使用嵌入的斜线分隔符命名以模拟目录)photos/2006/index.html photos/2006/January/img0001.jpg ... photos/2006/January/img0999。 jpg photos/2006/February/img1000.jpg ... Prefix="photos/2006/" 和 Delimiter="/" 的列表查询将返回 photos/2006 级别的键和“子目录”(index.html,一月,二月,...),但不包括任何更深层次的 .jpg 键。

所以想想就够了。您的分隔符可以是 .html、.jpg 或类似的东西。

于 2012-11-19T22:13:20.073 回答