背景
阿里云的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 删除成功
欢迎留言讨论。