根据对象键的子串查找/删除S3对象

时间:2016-11-03 08:27:12

标签: java amazon-s3

如果我们只有部分对象密钥,是否可以找到/删除S3对象?

场景:让我说S3中的用户存储123123.jpeg(存储桶名称:mybucket)我需要删除此对象,但我只知道123123,而不是整个关键字扩展名.jpeg

我知道我们可以在基于前缀的存储桶中找到对象,但只有当对象存在于存储桶内的路径中时才会应用AFAIK,例如:mybucket/imgpath/123123.jpeg < / p>

1 个答案:

答案 0 :(得分:1)

你可以使用蛮力:

List<String> matchingKeys = new ArrayList<>();
Predicate<String> predicate = Pattern.compile(".*/" + filename + "\\.\\w+").asPredicate();
for (ObjectListing listing = s3.listObjects(bucketName, "/");; listing = s3.listNextBatchOfObjects(listing)) {
    listing.getObjectSummaries().stream()
      .map(S3ObjectSummary::getKey)
      .filter(predicate)
      .forEach(matchingKeys::add);
    if (!listing.isTruncated()) {
        break;
    }
}

您可以删除:

,而不是收集点击数
.forEach(key -> s3.deleteObject(bucketName, key));

注意:这使用适合于您在无扩展名文件名下查找密钥的场景的正则表达式,但您可以根据需要调整正则表达式。例如,要查找其键中具有子字符串 where 的所有键,请使用正则表达式

".*" + substring ".*"

或不区分大小写

"(?i).*" + substring ".*"

免责声明:代码可能无法编译或工作,因为它在我的手机上被翻阅(但它有可能起作用)