update 优化 删除桶自动创建代码逻辑(云厂商限制不允许操作桶)

This commit is contained in:
疯狂的狮子Li 2024-10-28 18:09:32 +08:00
parent 761586cc3c
commit 2a9f245b39
2 changed files with 8 additions and 107 deletions

View File

@ -9,7 +9,6 @@ import org.dromara.common.core.utils.file.FileUtils;
import org.dromara.common.oss.constant.OssConstant; import org.dromara.common.oss.constant.OssConstant;
import org.dromara.common.oss.entity.UploadResult; import org.dromara.common.oss.entity.UploadResult;
import org.dromara.common.oss.enumd.AccessPolicyType; import org.dromara.common.oss.enumd.AccessPolicyType;
import org.dromara.common.oss.enumd.PolicyType;
import org.dromara.common.oss.exception.OssException; import org.dromara.common.oss.exception.OssException;
import org.dromara.common.oss.properties.OssProperties; import org.dromara.common.oss.properties.OssProperties;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
@ -23,7 +22,6 @@ import software.amazon.awssdk.services.s3.S3Configuration;
import software.amazon.awssdk.services.s3.crt.S3CrtHttpConfiguration; import software.amazon.awssdk.services.s3.crt.S3CrtHttpConfiguration;
import software.amazon.awssdk.services.s3.model.GetObjectResponse; import software.amazon.awssdk.services.s3.model.GetObjectResponse;
import software.amazon.awssdk.services.s3.model.NoSuchBucketException; import software.amazon.awssdk.services.s3.model.NoSuchBucketException;
import software.amazon.awssdk.services.s3.model.S3Exception;
import software.amazon.awssdk.services.s3.presigner.S3Presigner; import software.amazon.awssdk.services.s3.presigner.S3Presigner;
import software.amazon.awssdk.transfer.s3.S3TransferManager; import software.amazon.awssdk.transfer.s3.S3TransferManager;
import software.amazon.awssdk.transfer.s3.model.*; import software.amazon.awssdk.transfer.s3.model.*;
@ -115,8 +113,7 @@ public class OssClient {
.serviceConfiguration(config) .serviceConfiguration(config)
.build(); .build();
// 创建存储桶 checkBucket();
createBucket();
} catch (Exception e) { } catch (Exception e) {
if (e instanceof OssException) { if (e instanceof OssException) {
throw e; throw e;
@ -126,36 +123,18 @@ public class OssClient {
} }
/** /**
* 同步创建存储桶 * 检查桶是否存在
* 如果存储桶不存在会进行创建如果存储桶存在不执行任何操作
* *
* @throws OssException 当创建存储桶时发生异常时抛出 * @throws OssException 当创建存储桶时发生异常时抛出
*/ */
public void createBucket() { public void checkBucket() {
String bucketName = properties.getBucketName(); String bucketName = properties.getBucketName();
try { try {
// 尝试获取存储桶的信息 // 尝试获取存储桶的信息
client.headBucket( client.headBucket(x -> x.bucket(bucketName).build()).join();
x -> x.bucket(bucketName)
.build())
.join();
} catch (Exception ex) { } catch (Exception ex) {
if (ex.getCause() instanceof NoSuchBucketException) { if (ex.getCause() instanceof NoSuchBucketException) {
try { throw new OssException("Bucket桶是不存在的请核对配置信息:[" + ex.getMessage() + "]");
// 存储桶不存在尝试创建存储桶
client.createBucket(
x -> x.bucket(bucketName))
.join();
// 设置存储桶的访问策略Bucket Policy
client.putBucketPolicy(
x -> x.bucket(bucketName)
.policy(getPolicy(bucketName, getAccessPolicy().getPolicyType())))
.join();
} catch (S3Exception e) {
// 存储桶创建或策略设置失败
throw new OssException("创建Bucket失败, 请核对配置信息:[" + e.getMessage() + "]");
}
} else { } else {
throw new OssException("判断Bucket是否存在失败请核对配置信息:[" + ex.getMessage() + "]"); throw new OssException("判断Bucket是否存在失败请核对配置信息:[" + ex.getMessage() + "]");
} }
@ -529,77 +508,4 @@ public class OssClient {
return AccessPolicyType.getByType(properties.getAccessPolicy()); return AccessPolicyType.getByType(properties.getAccessPolicy());
} }
/**
* 生成 AWS S3 存储桶访问策略
*
* @param bucketName 存储桶
* @param policyType 桶策略类型
* @return 符合 AWS S3 存储桶访问策略格式的字符串
*/
private static String getPolicy(String bucketName, PolicyType policyType) {
String policy = switch (policyType) {
case WRITE -> """
{
"Version": "2012-10-17",
"Statement": []
}
""";
case READ_WRITE -> """
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetBucketLocation",
"s3:ListBucket",
"s3:ListBucketMultipartUploads"
],
"Resource": "arn:aws:s3:::bucketName"
},
{
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:AbortMultipartUpload",
"s3:DeleteObject",
"s3:GetObject",
"s3:ListMultipartUploadParts",
"s3:PutObject"
],
"Resource": "arn:aws:s3:::bucketName/*"
}
]
}
""";
case READ -> """
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": ["s3:GetBucketLocation"],
"Resource": "arn:aws:s3:::bucketName"
},
{
"Effect": "Deny",
"Principal": "*",
"Action": ["s3:ListBucket"],
"Resource": "arn:aws:s3:::bucketName"
},
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::bucketName/*"
}
]
}
""";
};
return policy.replaceAll("bucketName", bucketName);
}
} }

View File

@ -17,17 +17,17 @@ public enum AccessPolicyType {
/** /**
* private * private
*/ */
PRIVATE("0", BucketCannedACL.PRIVATE, ObjectCannedACL.PRIVATE, PolicyType.WRITE), PRIVATE("0", BucketCannedACL.PRIVATE, ObjectCannedACL.PRIVATE),
/** /**
* public * public
*/ */
PUBLIC("1", BucketCannedACL.PUBLIC_READ_WRITE, ObjectCannedACL.PUBLIC_READ_WRITE, PolicyType.READ_WRITE), PUBLIC("1", BucketCannedACL.PUBLIC_READ_WRITE, ObjectCannedACL.PUBLIC_READ_WRITE),
/** /**
* custom * custom
*/ */
CUSTOM("2", BucketCannedACL.PUBLIC_READ, ObjectCannedACL.PUBLIC_READ, PolicyType.READ); CUSTOM("2", BucketCannedACL.PUBLIC_READ, ObjectCannedACL.PUBLIC_READ);
/** /**
* 权限类型数据库值 * 权限类型数据库值
@ -44,11 +44,6 @@ public enum AccessPolicyType {
*/ */
private final ObjectCannedACL objectCannedACL; private final ObjectCannedACL objectCannedACL;
/**
* 桶策略类型
*/
private final PolicyType policyType;
public static AccessPolicyType getByType(String type) { public static AccessPolicyType getByType(String type) {
for (AccessPolicyType value : values()) { for (AccessPolicyType value : values()) {
if (value.getType().equals(type)) { if (value.getType().equals(type)) {