【问题标题】:Delete all versions of an object S3 using java使用 java 删除对象 S3 的所有版本
【发布时间】:2021-06-25 12:42:35
【问题描述】:

我想使用 software.amazon.awssdk.s3 v2 删除具有给定密钥的对象的所有版本。

到目前为止,我发现没有这样的deleteAllVersions(key),您必须获取对象的所有 versionId 并迭代并删除每个版本。 下一个障碍是,没有这样的listAllVersions(key),只有listAllVersions(prefix)。所以如果我想listAllVersions("a")对象“a”的前缀“a”作为过滤器,我也会得到所有版本的“aa”、“ab”、“ac”等等。

现在可以迭代忽略所有不具有精确键“a”的对象。但是如何处理截断的响应呢?

如何删除具有特定键的对象的所有版本,包括标记为已删除的版本?

【问题讨论】:

  • @Ninad Gaiwad:这是列出版本。部分问题是,如何获取特定密钥的所有版本的完整列表。由于请求似乎按它们存储的顺序返回对象,并且您不能按键过滤(仅按前缀),我不知道如何确保获得完全“a”的所有版本。

标签: java amazon-s3


【解决方案1】:

使用listObjectVersionsPaginator返回的ListObjectVersionsIterable

    //Pre-filter with prefix
    ListObjectVersionsRequest listRequest = ListObjectVersionsRequest.builder().bucket(bucketName).prefix(key).build();
    ListObjectVersionsIterable responses = s3Client.listObjectVersionsPaginator(listRequest);

    for (ObjectVersion objectVersion : responses.versions())
    {
        //Filter pre-filtered result
        if (objectVersion.key().equals(key))
        {
            DeleteObjectRequest deleteRequest = DeleteObjectRequest.builder().bucket(bucketName).key(key).versionId(versionId).build();
            DeleteObjectResponse response = s3Client.deleteObject(deleteRequest);
        }
    }

Paginator 将在内部处理调用:https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3Client.html#listObjectVersionsPaginator-software.amazon.awssdk.services.s3.model.ListObjectVersionsRequest-

【讨论】:

    猜你喜欢
    • 2018-03-30
    • 2020-08-06
    • 2020-02-17
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    相关资源
    最近更新 更多