如果我们只有部分对象密钥,是否可以找到/删除S3对象?
场景:让我说S3中的用户存储123123.jpeg
(存储桶名称:mybucket)我需要删除此对象,但我只知道123123
,而不是整个关键字扩展名.jpeg
。
我知道我们可以在基于前缀的存储桶中找到对象,但只有当对象存在于存储桶内的路径中时才会应用AFAIK,例如:mybucket/imgpath/123123.jpeg
< / p>
答案 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 ".*"
等
免责声明:代码可能无法编译或工作,因为它在我的手机上被翻阅(但它有可能起作用)