AlexRomeo
发布于 2024-12-04 / 50 阅读
1
0

OSS-批量删除桶

背景

阿里云的oss管理页面不存在批量删除的功能,“公司的关系户实习生”存在一点点的智力问题,无休止的创建oss。

众所周知,阿里为了防止误删除,想要删除bucket的话,必须清理桶内的文件,否则不允许删除桶,通过页面逐个的删除文件操作起来太耽误时间,故此通过API来搞定。

环境

使用的开发软件为idea(理论上支持maven的java开发软件都可以),需要在maven的pom文件中添加依赖,如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>net.alexromeo</groupId>
    <artifactId>AlexProject</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.10.2</version>
        </dependency>
    </dependencies>
</project>

需要有管理账号具备oss的管理权限,且拥有AccessKey,代码如下

package net.alexromeo;

/**
 * @author AlexRomeo
 * @data 2024/12/4 13:08
 * version 1.0
 */
// 导入必要的包

import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.*;

import java.util.ArrayList;
import java.util.List;

public class DeleteBucket {
    public static void main(String[] args) {
        String endpoint = "oss-cn-beijing.aliyuncs.com";
        String accessKeyId = "LTAI******YgsAQ";
        String accessKeySecret = "J8in9t******EoDIwZ";
        String bucketName = "";

        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            // 获取bucket列表信息
            List<Bucket> buckets = ossClient.listBuckets();

            for (Bucket bucket : buckets) {
                bucketName = bucket.getName();
                System.out.println("正在处理Bucket: " + bucketName);

                // 清空Bucket中的所有文件和子目录
                deleteAllObjects(ossClient, bucketName);
                deleteAllMultipartUploads(ossClient, bucketName);

                System.out.println("清理Bucket " + bucketName + " 文件完成");

                // 删除Bucket
                ossClient.deleteBucket(bucketName);
                System.out.println("Bucket " + bucketName + " 删除成功");
            }
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("Bucket " + bucketName + "删除失败");
        } finally {
            // 关闭OSSClient。
            ossClient.shutdown();
        }
    }

    private static void deleteAllObjects(OSS ossClient, String bucketName) {
        ListObjectsRequest listObjectsRequest = new ListObjectsRequest(bucketName);
        ObjectListing objectListing;
        List<String> keys = new ArrayList<>();

        do {
            objectListing = ossClient.listObjects(listObjectsRequest);

            // 获取所有文件的key
            for (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()) {
                keys.add(objectSummary.getKey());
            }

            // 删除所有文件
            if (!keys.isEmpty()) {
                ossClient.deleteObjects(new DeleteObjectsRequest(bucketName).withKeys(keys));
                System.out.println("已删除 " + keys.size() + " 个文件");
                keys.clear();
            }

            // 设置下一个marker
            listObjectsRequest.setMarker(objectListing.getNextMarker());

        } while (objectListing.isTruncated());
    }
    private static void deleteAllMultipartUploads(OSS ossClient, String bucketName) {
        ListMultipartUploadsRequest listMultipartUploadsRequest = new ListMultipartUploadsRequest(bucketName);
        MultipartUploadListing multipartUploadListing;

        do {
            multipartUploadListing = ossClient.listMultipartUploads(listMultipartUploadsRequest);
            // 获取所有未完成的multipart uploads的uploadId
            for (MultipartUpload multipartUpload : multipartUploadListing.getMultipartUploads()) {
                ossClient.abortMultipartUpload(new AbortMultipartUploadRequest(bucketName, multipartUpload.getKey(), multipartUpload.getUploadId()));
                System.out.println("已删除 multipart upload: " + multipartUpload.getKey() + ", uploadId: " + multipartUpload.getUploadId());
            }
            // 设置下一个key marker
            listMultipartUploadsRequest.setKeyMarker(multipartUploadListing.getNextKeyMarker());
            listMultipartUploadsRequest.setUploadIdMarker(multipartUploadListing.getNextUploadIdMarker());
        } while (multipartUploadListing.isTruncated());
    }
}

结果

运行即可,下面是一部分的结果展示。

正在处理Bucket: gyz
已删除 1 个文件
清理Bucket gyz 文件完成
Bucket gyz 删除成功
正在处理Bucket: ls
已删除 7 个文件
清理Bucketls 文件完成
Bucket ls 删除成功
正在处理Bucket: wx
清理Bucket wx 文件完成
Bucket wx 删除成功
正在处理Bucket: lc
已删除 4 个文件
清理Bucket lc 文件完成
Bucket slc 删除成功

欢迎留言讨论。


评论