【问题标题】:AWS S3 get keys containing textAWS S3 获取包含文本的密钥
【发布时间】:2017-12-27 15:31:33
【问题描述】:

我正在尝试从 S3 获取文件。

像往常一样,我的文件按如下方式组织在存储桶中:

bucket/<prefixes>/files

我想检索具有特定文件名的文件

例如:

  1. 以给定文本开头的文件 (myfile-*)
  2. 具有特定扩展名 (*.csv) 的文件
  3. 具有特定文本的文件名 (text)

对于第一种情况,我可以使用如下前缀:

ObjectListing objectListing = s3Client.listObjects(bucketName, "test/myfile");

但是对于其他两种情况,我找不到任何解决方案。

我尝试使用如下通配符:

ObjectListing objectListing = s3Client.listObjects(bucketName, "test/*.csv");

但它没有返回任何结果。

是否有任何解决方法(除了在我的代码中获取键列表和过滤)??

感谢任何帮助。

【问题讨论】:

  • 此存储桶中大约有多少个文件? 100、1000、数百万?
  • 它可以是任何数字。我无法控制摄取。文件被第 3 方摄取
  • 你找到解决 2° 情况的方法了吗?

标签: java amazon-web-services amazon-s3 aws-java-sdk


【解决方案1】:

您的用例很常见。

我不知道有任何 S3 API 允许您执行除前缀匹配之外的任何操作。

处理这个问题的方法是维护一个单独的、可搜索的文件名副本(可能还有其他元数据)。换句话说,每个文件在关系数据库的表中都有一行。或者您可以维护一个列出所有文件名的“索引”文件。

如果文件创建/删除是通过您的代码执行的,您可以添加所需的代码以使文件列表与您的存储桶保持同步。如果没有,那么您可以使用S3 event notifications 来驱动文件列表更新。

当您想按文件名搜索时,您可以在文件列表或数据库表中查找匹配的文件名。然后点击 S3 执行任何需要的操作。

【讨论】:

  • 我不必成为关系数据库。它可以是 NoSQL 数据库,甚至是 Elasticsearch 之类的搜索引擎。
  • @MarkB 是的,它甚至可以是一个平面文件。
  • 我更多地考虑 AWS 服务,例如 DynamoDB 和 Elasticsearch,当新文件到达 S3 时可以自动更新。
【解决方案2】:

你做不到,S3中没有通配符,文件甚至可以包含*字符

【讨论】:

  • 所以..我只能检索以文本开头的文件名,但不能以文本结尾或包含给定文本...
  • 看起来是这样:(你只能通过前缀或编码从S3获取文件。如果你需要更多,你可以获取所有文件,并使用正则表达式
猜你喜欢
  • 1970-01-01
  • 2017-03-16
  • 2016-02-09
  • 2018-02-10
  • 1970-01-01
  • 2019-10-01
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
相关资源
最近更新 更多