mirror of
https://gitee.com/dromara/RuoYi-Vue-Plus.git
synced 2026-03-27 07:43:24 +08:00
update 优化 缩短oss模块命名
This commit is contained in:
@@ -4,12 +4,12 @@ import cn.hutool.core.lang.Assert;
|
|||||||
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.IdUtil;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
import org.dromara.common.oss.config.S3StorageClientConfig;
|
import org.dromara.common.oss.config.OssClientConfig;
|
||||||
|
import org.dromara.common.oss.exception.S3StorageException;
|
||||||
|
import org.dromara.common.oss.io.OutputStreamDownloadSubscriber;
|
||||||
import org.dromara.common.oss.model.GetObjectResult;
|
import org.dromara.common.oss.model.GetObjectResult;
|
||||||
import org.dromara.common.oss.model.HandleAsyncResult;
|
import org.dromara.common.oss.model.HandleAsyncResult;
|
||||||
import org.dromara.common.oss.model.PutObjectResult;
|
import org.dromara.common.oss.model.PutObjectResult;
|
||||||
import org.dromara.common.oss.exception.S3StorageException;
|
|
||||||
import org.dromara.common.oss.io.OutputStreamDownloadSubscriber;
|
|
||||||
import software.amazon.awssdk.core.async.AsyncRequestBody;
|
import software.amazon.awssdk.core.async.AsyncRequestBody;
|
||||||
import software.amazon.awssdk.core.async.AsyncResponseTransformer;
|
import software.amazon.awssdk.core.async.AsyncResponseTransformer;
|
||||||
import software.amazon.awssdk.core.async.ResponsePublisher;
|
import software.amazon.awssdk.core.async.ResponsePublisher;
|
||||||
@@ -46,7 +46,7 @@ import java.util.function.Function;
|
|||||||
* @author 秋辞未寒
|
* @author 秋辞未寒
|
||||||
*/
|
*/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public abstract class AbstractS3StorageClientImpl implements S3StorageClient {
|
public abstract class AbstractOssClientImpl implements OssClient {
|
||||||
|
|
||||||
private final AtomicBoolean initialized = new AtomicBoolean(false);
|
private final AtomicBoolean initialized = new AtomicBoolean(false);
|
||||||
|
|
||||||
@@ -60,7 +60,7 @@ public abstract class AbstractS3StorageClientImpl implements S3StorageClient {
|
|||||||
/**
|
/**
|
||||||
* S3 存储客户端配置。
|
* S3 存储客户端配置。
|
||||||
*/
|
*/
|
||||||
protected S3StorageClientConfig config;
|
protected OssClientConfig config;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Amazon S3 异步客户端。
|
* Amazon S3 异步客户端。
|
||||||
@@ -82,7 +82,7 @@ public abstract class AbstractS3StorageClientImpl implements S3StorageClient {
|
|||||||
*/
|
*/
|
||||||
protected ExecutorService asyncExecutor;
|
protected ExecutorService asyncExecutor;
|
||||||
|
|
||||||
public AbstractS3StorageClientImpl(String clientId, S3StorageClientConfig config) {
|
public AbstractOssClientImpl(String clientId, OssClientConfig config) {
|
||||||
Assert.notNull(config, () -> S3StorageException.form("S3StorageClientConfig must not be null"));
|
Assert.notNull(config, () -> S3StorageException.form("S3StorageClientConfig must not be null"));
|
||||||
// 如果没有设置存储客户端ID,则随机生成一个
|
// 如果没有设置存储客户端ID,则随机生成一个
|
||||||
this.clientId = StringUtils.isBlank(clientId) ? IdUtil.fastSimpleUUID() : clientId;
|
this.clientId = StringUtils.isBlank(clientId) ? IdUtil.fastSimpleUUID() : clientId;
|
||||||
@@ -96,7 +96,7 @@ public abstract class AbstractS3StorageClientImpl implements S3StorageClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public S3StorageClientConfig config() {
|
public OssClientConfig config() {
|
||||||
// 仅返回copy副本,防篡改
|
// 仅返回copy副本,防篡改
|
||||||
return this.config.copy();
|
return this.config.copy();
|
||||||
}
|
}
|
||||||
@@ -127,7 +127,7 @@ public abstract class AbstractS3StorageClientImpl implements S3StorageClient {
|
|||||||
abstract void doInitialize();
|
abstract void doInitialize();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void refresh(S3StorageClientConfig config) {
|
public void refresh(OssClientConfig config) {
|
||||||
if (Objects.equals(this.config, config)) {
|
if (Objects.equals(this.config, config)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -148,13 +148,13 @@ public abstract class AbstractS3StorageClientImpl implements S3StorageClient {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean verifyConfig(Function<S3StorageClientConfig, Boolean> verifyConfigAction) {
|
public boolean verifyConfig(Function<OssClientConfig, Boolean> verifyConfigAction) {
|
||||||
S3StorageClientConfig config = config();
|
OssClientConfig config = config();
|
||||||
return Boolean.TRUE.equals(verifyConfigAction.apply(config));
|
return Boolean.TRUE.equals(verifyConfigAction.apply(config));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean verifyConfig(S3StorageClientConfig verifyConfig) {
|
public boolean verifyConfig(OssClientConfig verifyConfig) {
|
||||||
return verifyConfig((config) -> Objects.equals(config, verifyConfig));
|
return verifyConfig((config) -> Objects.equals(config, verifyConfig));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package org.dromara.common.oss.client;
|
package org.dromara.common.oss.client;
|
||||||
|
|
||||||
import org.dromara.common.oss.config.S3AsyncExecutorConfig;
|
import org.dromara.common.oss.config.OssAsyncExecutorConfig;
|
||||||
import org.dromara.common.oss.config.S3StorageClientConfig;
|
import org.dromara.common.oss.config.OssClientConfig;
|
||||||
import org.dromara.common.oss.exception.S3StorageException;
|
import org.dromara.common.oss.exception.S3StorageException;
|
||||||
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
|
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
|
||||||
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
|
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
|
||||||
@@ -21,9 +21,9 @@ import java.util.concurrent.Executors;
|
|||||||
*
|
*
|
||||||
* @author 秋辞未寒
|
* @author 秋辞未寒
|
||||||
*/
|
*/
|
||||||
public class DefaultS3StorageClientImpl extends AbstractS3StorageClientImpl {
|
public class DefaultOssClientImpl extends AbstractOssClientImpl {
|
||||||
|
|
||||||
public DefaultS3StorageClientImpl(String clientId, S3StorageClientConfig config) {
|
public DefaultOssClientImpl(String clientId, OssClientConfig config) {
|
||||||
super(clientId, config);
|
super(clientId, config);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,7 +79,7 @@ public class DefaultS3StorageClientImpl extends AbstractS3StorageClientImpl {
|
|||||||
.build();
|
.build();
|
||||||
|
|
||||||
// 创建异步调度器对象
|
// 创建异步调度器对象
|
||||||
S3AsyncExecutorConfig asyncExecutorConfig = config.asyncExecutorConfig();
|
OssAsyncExecutorConfig asyncExecutorConfig = config.asyncExecutorConfig();
|
||||||
// 是否使用虚拟线程
|
// 是否使用虚拟线程
|
||||||
if (asyncExecutorConfig.enabledVirtualThread()) {
|
if (asyncExecutorConfig.enabledVirtualThread()) {
|
||||||
this.asyncExecutor = Executors.newVirtualThreadPerTaskExecutor();
|
this.asyncExecutor = Executors.newVirtualThreadPerTaskExecutor();
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
package org.dromara.common.oss.client;
|
package org.dromara.common.oss.client;
|
||||||
|
|
||||||
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.IdUtil;
|
||||||
import org.dromara.common.oss.config.S3StorageClientConfig;
|
import org.dromara.common.oss.config.OssClientConfig;
|
||||||
|
import org.dromara.common.oss.io.OutputStreamDownloadSubscriber;
|
||||||
import org.dromara.common.oss.model.GetObjectResult;
|
import org.dromara.common.oss.model.GetObjectResult;
|
||||||
import org.dromara.common.oss.model.HandleAsyncResult;
|
import org.dromara.common.oss.model.HandleAsyncResult;
|
||||||
import org.dromara.common.oss.model.PutObjectResult;
|
import org.dromara.common.oss.model.PutObjectResult;
|
||||||
import org.dromara.common.oss.io.OutputStreamDownloadSubscriber;
|
|
||||||
import software.amazon.awssdk.core.async.AsyncRequestBody;
|
import software.amazon.awssdk.core.async.AsyncRequestBody;
|
||||||
import software.amazon.awssdk.core.async.AsyncResponseTransformer;
|
import software.amazon.awssdk.core.async.AsyncResponseTransformer;
|
||||||
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
|
import software.amazon.awssdk.services.s3.model.GetObjectRequest;
|
||||||
@@ -39,7 +39,7 @@ import java.util.function.Function;
|
|||||||
*
|
*
|
||||||
* @author 秋辞未寒
|
* @author 秋辞未寒
|
||||||
*/
|
*/
|
||||||
public interface S3StorageClient extends AutoCloseable {
|
public interface OssClient extends AutoCloseable {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* S3 存储客户端ID
|
* S3 存储客户端ID
|
||||||
@@ -55,7 +55,7 @@ public interface S3StorageClient extends AutoCloseable {
|
|||||||
/**
|
/**
|
||||||
* 获取客户端配置copy副本
|
* 获取客户端配置copy副本
|
||||||
*/
|
*/
|
||||||
S3StorageClientConfig config();
|
OssClientConfig config();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否已经初始化
|
* 是否已经初始化
|
||||||
@@ -72,7 +72,7 @@ public interface S3StorageClient extends AutoCloseable {
|
|||||||
*
|
*
|
||||||
* @param config 配置项
|
* @param config 配置项
|
||||||
*/
|
*/
|
||||||
void refresh(S3StorageClientConfig config);
|
void refresh(OssClientConfig config);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 校验客户端配置
|
* 校验客户端配置
|
||||||
@@ -82,7 +82,7 @@ public interface S3StorageClient extends AutoCloseable {
|
|||||||
* @param verifyConfigAction 校验配置动作函数
|
* @param verifyConfigAction 校验配置动作函数
|
||||||
* @return 是否一致
|
* @return 是否一致
|
||||||
*/
|
*/
|
||||||
boolean verifyConfig(Function<S3StorageClientConfig,Boolean> verifyConfigAction);
|
boolean verifyConfig(Function<OssClientConfig, Boolean> verifyConfigAction);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 校验客户端配置与传入的待校验配置是否一致
|
* 校验客户端配置与传入的待校验配置是否一致
|
||||||
@@ -92,7 +92,7 @@ public interface S3StorageClient extends AutoCloseable {
|
|||||||
* @param verifyConfig 待校验的配置
|
* @param verifyConfig 待校验的配置
|
||||||
* @return 是否一致
|
* @return 是否一致
|
||||||
*/
|
*/
|
||||||
boolean verifyConfig(S3StorageClientConfig verifyConfig);
|
boolean verifyConfig(OssClientConfig verifyConfig);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 执行自定义上传请求。
|
* 执行自定义上传请求。
|
||||||
@@ -16,10 +16,10 @@ import java.util.Optional;
|
|||||||
* @author 秋辞未寒
|
* @author 秋辞未寒
|
||||||
*/
|
*/
|
||||||
@Builder
|
@Builder
|
||||||
public record S3AccessControlPolicyConfig(
|
public record AccessControlPolicyConfig(
|
||||||
boolean enabled
|
boolean enabled
|
||||||
, AccessPolicy accessPolicy
|
, AccessPolicy accessPolicy
|
||||||
) implements Config<S3AccessControlPolicyConfig, S3AccessControlPolicyConfig.S3AccessControlPolicyConfigBuilder>, Serializable {
|
) implements Config<AccessControlPolicyConfig, AccessControlPolicyConfig.AccessControlPolicyConfigBuilder>, Serializable {
|
||||||
|
|
||||||
@Serial
|
@Serial
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
@@ -27,7 +27,7 @@ public record S3AccessControlPolicyConfig(
|
|||||||
/**
|
/**
|
||||||
* 默认访问策略配置
|
* 默认访问策略配置
|
||||||
*/
|
*/
|
||||||
public static final S3AccessControlPolicyConfig DEFAULT = S3AccessControlPolicyConfig.builder()
|
public static final AccessControlPolicyConfig DEFAULT = AccessControlPolicyConfig.builder()
|
||||||
.enabled(false)
|
.enabled(false)
|
||||||
.accessPolicy(AccessPolicy.PUBLIC_READ_WRITE)
|
.accessPolicy(AccessPolicy.PUBLIC_READ_WRITE)
|
||||||
.build();
|
.build();
|
||||||
@@ -39,12 +39,12 @@ public record S3AccessControlPolicyConfig(
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public S3AccessControlPolicyConfig copy() {
|
public AccessControlPolicyConfig copy() {
|
||||||
return toBuilder().build();
|
return toBuilder().build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public S3AccessControlPolicyConfigBuilder toBuilder() {
|
public AccessControlPolicyConfigBuilder toBuilder() {
|
||||||
return builder()
|
return builder()
|
||||||
.enabled(enabled)
|
.enabled(enabled)
|
||||||
.accessPolicy(accessPolicy);
|
.accessPolicy(accessPolicy);
|
||||||
@@ -15,10 +15,10 @@ import java.io.Serializable;
|
|||||||
* @author 秋辞未寒
|
* @author 秋辞未寒
|
||||||
*/
|
*/
|
||||||
@Builder
|
@Builder
|
||||||
public record S3AsyncExecutorConfig(
|
public record OssAsyncExecutorConfig(
|
||||||
boolean enabledVirtualThread
|
boolean enabledVirtualThread
|
||||||
, int corePoolSize
|
, int corePoolSize
|
||||||
) implements Config<S3AsyncExecutorConfig, S3AsyncExecutorConfig.S3AsyncExecutorConfigBuilder>, Serializable {
|
) implements Config<OssAsyncExecutorConfig, OssAsyncExecutorConfig.OssAsyncExecutorConfigBuilder>, Serializable {
|
||||||
|
|
||||||
@Serial
|
@Serial
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
@@ -31,7 +31,7 @@ public record S3AsyncExecutorConfig(
|
|||||||
/**
|
/**
|
||||||
* 默认异步执行器配置
|
* 默认异步执行器配置
|
||||||
*/
|
*/
|
||||||
public static final S3AsyncExecutorConfig DEFAULT = S3AsyncExecutorConfig.builder()
|
public static final OssAsyncExecutorConfig DEFAULT = OssAsyncExecutorConfig.builder()
|
||||||
.enabledVirtualThread(false)
|
.enabledVirtualThread(false)
|
||||||
.corePoolSize(DEFAULT_CORE_POOL_SIZE)
|
.corePoolSize(DEFAULT_CORE_POOL_SIZE)
|
||||||
.build();
|
.build();
|
||||||
@@ -53,12 +53,12 @@ public record S3AsyncExecutorConfig(
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public S3AsyncExecutorConfig copy() {
|
public OssAsyncExecutorConfig copy() {
|
||||||
return toBuilder().build();
|
return toBuilder().build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public S3AsyncExecutorConfigBuilder toBuilder() {
|
public OssAsyncExecutorConfigBuilder toBuilder() {
|
||||||
return builder()
|
return builder()
|
||||||
.enabledVirtualThread(enabledVirtualThread)
|
.enabledVirtualThread(enabledVirtualThread)
|
||||||
.corePoolSize(corePoolSize);
|
.corePoolSize(corePoolSize);
|
||||||
@@ -26,7 +26,7 @@ import java.util.Optional;
|
|||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@Builder
|
@Builder
|
||||||
@EqualsAndHashCode
|
@EqualsAndHashCode
|
||||||
public class S3StorageClientConfig implements Config<S3StorageClientConfig, S3StorageClientConfig.S3StorageClientConfigBuilder>, Serializable {
|
public class OssClientConfig implements Config<OssClientConfig, OssClientConfig.OssClientConfigBuilder>, Serializable {
|
||||||
|
|
||||||
@Serial
|
@Serial
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
@@ -79,12 +79,12 @@ public class S3StorageClientConfig implements Config<S3StorageClientConfig, S3St
|
|||||||
/**
|
/**
|
||||||
* ACL访问策略配置
|
* ACL访问策略配置
|
||||||
*/
|
*/
|
||||||
private final S3AccessControlPolicyConfig accessControlPolicyConfig;
|
private final AccessControlPolicyConfig accessControlPolicyConfig;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 异步调度池配置
|
* 异步调度池配置
|
||||||
*/
|
*/
|
||||||
private final S3AsyncExecutorConfig asyncExecutorConfig;
|
private final OssAsyncExecutorConfig asyncExecutorConfig;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 访问端点
|
* 访问端点
|
||||||
@@ -149,20 +149,42 @@ public class S3StorageClientConfig implements Config<S3StorageClientConfig, S3St
|
|||||||
return Optional.ofNullable(prefix);
|
return Optional.ofNullable(prefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public static OssClientConfig formProperties(OssProperties properties) {
|
||||||
* ACL访问策略配置
|
return formPropertiesBuilder(properties).build();
|
||||||
*/
|
|
||||||
public @NonNull S3AccessControlPolicyConfig accessControlPolicyConfig() {
|
|
||||||
return Optional.ofNullable(accessControlPolicyConfig)
|
|
||||||
.orElse(S3AccessControlPolicyConfig.DEFAULT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public static OssClientConfigBuilder formPropertiesBuilder(OssProperties properties) {
|
||||||
* ACL访问策略配置
|
String regionString = properties.getRegion();
|
||||||
*/
|
Region region = Region.US_EAST_1;
|
||||||
public @NonNull S3AsyncExecutorConfig asyncExecutorConfig() {
|
if (StringUtils.isNotBlank(regionString)) {
|
||||||
return Optional.ofNullable(asyncExecutorConfig)
|
region = Region.of(regionString);
|
||||||
.orElse(S3AsyncExecutorConfig.DEFAULT);
|
}
|
||||||
|
|
||||||
|
// 是否使用路径风格应当由使用者明确去配置,此处的配置只是为了适配旧的配置项
|
||||||
|
// MinIO 使用 HTTPS 限制使用域名访问,站点填域名。需要启用路径样式访问
|
||||||
|
boolean usePathStyleAccess = !StringUtils.containsAny(properties.getEndpoint(), OssConstant.CLOUD_SERVICE);
|
||||||
|
|
||||||
|
// 绝大多数的云厂商都是不允许操作ACL的,所以此处的默认配置也是禁用ACL的
|
||||||
|
AccessControlPolicyConfig accessControlPolicyConfig = AccessControlPolicyConfig.DEFAULT;
|
||||||
|
// 目前自定义实现的 Client 上传/下载/删除中并没有实际使用到ACL相关配置
|
||||||
|
// 仅有业务中的链接预签名使用到(SysOssServiceImpl#matchingUrl),更多只是作为一个扩展点保留,如有需要ACL的自行实现调用逻辑
|
||||||
|
String accessPolicyString = properties.getAccessPolicy();
|
||||||
|
if (StringUtils.isNotBlank(accessPolicyString)) {
|
||||||
|
accessControlPolicyConfig = AccessControlPolicyConfig.builder()
|
||||||
|
.enabled(true)
|
||||||
|
.accessPolicy(AccessPolicy.formType(accessPolicyString))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
return builder()
|
||||||
|
.endpoint(properties.getEndpoint())
|
||||||
|
.domain(properties.getDomainUrl())
|
||||||
|
.accessKey(properties.getAccessKey())
|
||||||
|
.secretKey(properties.getSecretKey())
|
||||||
|
.bucket(properties.getBucketName())
|
||||||
|
.region(region)
|
||||||
|
.useHttps(SystemConstants.YES.equals(properties.getIsHttps()))
|
||||||
|
.usePathStyleAccess(usePathStyleAccess)
|
||||||
|
.accessControlPolicyConfig(accessControlPolicyConfig);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -224,11 +246,27 @@ public class S3StorageClientConfig implements Config<S3StorageClientConfig, S3St
|
|||||||
return usePathStyleAccess ? BucketUrlUtil.getPathStyleBucketUrl(useHttps, url, bucket) : BucketUrlUtil.getSiteStyleBucketUrl(useHttps, url, bucket);
|
return usePathStyleAccess ? BucketUrlUtil.getPathStyleBucketUrl(useHttps, url, bucket) : BucketUrlUtil.getSiteStyleBucketUrl(useHttps, url, bucket);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ACL访问策略配置
|
||||||
|
*/
|
||||||
|
public @NonNull AccessControlPolicyConfig accessControlPolicyConfig() {
|
||||||
|
return Optional.ofNullable(accessControlPolicyConfig)
|
||||||
|
.orElse(AccessControlPolicyConfig.DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ACL访问策略配置
|
||||||
|
*/
|
||||||
|
public @NonNull OssAsyncExecutorConfig asyncExecutorConfig() {
|
||||||
|
return Optional.ofNullable(asyncExecutorConfig)
|
||||||
|
.orElse(OssAsyncExecutorConfig.DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 复制S3存储客户端配置对象
|
* 复制S3存储客户端配置对象
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public S3StorageClientConfig copy() {
|
public OssClientConfig copy() {
|
||||||
return toBuilder().build();
|
return toBuilder().build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -236,7 +274,7 @@ public class S3StorageClientConfig implements Config<S3StorageClientConfig, S3St
|
|||||||
* 转为S3存储客户端配置构建器对象
|
* 转为S3存储客户端配置构建器对象
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public S3StorageClientConfigBuilder toBuilder() {
|
public OssClientConfigBuilder toBuilder() {
|
||||||
return builder()
|
return builder()
|
||||||
.endpoint(endpoint)
|
.endpoint(endpoint)
|
||||||
.domain(domain)
|
.domain(domain)
|
||||||
@@ -250,42 +288,4 @@ public class S3StorageClientConfig implements Config<S3StorageClientConfig, S3St
|
|||||||
.accessControlPolicyConfig(accessControlPolicyConfig().copy())
|
.accessControlPolicyConfig(accessControlPolicyConfig().copy())
|
||||||
.asyncExecutorConfig(asyncExecutorConfig().copy());
|
.asyncExecutorConfig(asyncExecutorConfig().copy());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static S3StorageClientConfig formProperties(OssProperties properties){
|
|
||||||
return formPropertiesBuilder(properties).build();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static S3StorageClientConfigBuilder formPropertiesBuilder(OssProperties properties){
|
|
||||||
String regionString = properties.getRegion();
|
|
||||||
Region region = Region.US_EAST_1;
|
|
||||||
if (StringUtils.isNotBlank(regionString)) {
|
|
||||||
region = Region.of(regionString);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 是否使用路径风格应当由使用者明确去配置,此处的配置只是为了适配旧的配置项
|
|
||||||
// MinIO 使用 HTTPS 限制使用域名访问,站点填域名。需要启用路径样式访问
|
|
||||||
boolean usePathStyleAccess = !StringUtils.containsAny(properties.getEndpoint(), OssConstant.CLOUD_SERVICE);
|
|
||||||
|
|
||||||
// 绝大多数的云厂商都是不允许操作ACL的,所以此处的默认配置也是禁用ACL的
|
|
||||||
S3AccessControlPolicyConfig accessControlPolicyConfig = S3AccessControlPolicyConfig.DEFAULT;
|
|
||||||
// 目前自定义实现的 Client 上传/下载/删除中并没有实际使用到ACL相关配置
|
|
||||||
// 仅有业务中的链接预签名使用到(SysOssServiceImpl#matchingUrl),更多只是作为一个扩展点保留,如有需要ACL的自行实现调用逻辑
|
|
||||||
String accessPolicyString = properties.getAccessPolicy();
|
|
||||||
if (StringUtils.isNotBlank(accessPolicyString)) {
|
|
||||||
accessControlPolicyConfig = S3AccessControlPolicyConfig.builder()
|
|
||||||
.enabled(true)
|
|
||||||
.accessPolicy(AccessPolicy.formType(accessPolicyString))
|
|
||||||
.build();
|
|
||||||
}
|
|
||||||
return builder()
|
|
||||||
.endpoint(properties.getEndpoint())
|
|
||||||
.domain(properties.getDomainUrl())
|
|
||||||
.accessKey(properties.getAccessKey())
|
|
||||||
.secretKey(properties.getSecretKey())
|
|
||||||
.bucket(properties.getBucketName())
|
|
||||||
.region(region)
|
|
||||||
.useHttps(SystemConstants.YES.equals(properties.getIsHttps()))
|
|
||||||
.usePathStyleAccess(usePathStyleAccess)
|
|
||||||
.accessControlPolicyConfig(accessControlPolicyConfig);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -4,12 +4,12 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
import org.dromara.common.core.constant.CacheNames;
|
import org.dromara.common.core.constant.CacheNames;
|
||||||
import org.dromara.common.core.utils.StringUtils;
|
import org.dromara.common.core.utils.StringUtils;
|
||||||
import org.dromara.common.json.utils.JsonUtils;
|
import org.dromara.common.json.utils.JsonUtils;
|
||||||
|
import org.dromara.common.oss.client.DefaultOssClientImpl;
|
||||||
|
import org.dromara.common.oss.client.OssClient;
|
||||||
|
import org.dromara.common.oss.config.OssClientConfig;
|
||||||
import org.dromara.common.oss.constant.OssConstant;
|
import org.dromara.common.oss.constant.OssConstant;
|
||||||
import org.dromara.common.oss.properties.OssProperties;
|
|
||||||
import org.dromara.common.oss.client.DefaultS3StorageClientImpl;
|
|
||||||
import org.dromara.common.oss.client.S3StorageClient;
|
|
||||||
import org.dromara.common.oss.config.S3StorageClientConfig;
|
|
||||||
import org.dromara.common.oss.exception.S3StorageException;
|
import org.dromara.common.oss.exception.S3StorageException;
|
||||||
|
import org.dromara.common.oss.properties.OssProperties;
|
||||||
import org.dromara.common.redis.utils.CacheUtils;
|
import org.dromara.common.redis.utils.CacheUtils;
|
||||||
import org.dromara.common.redis.utils.RedisUtils;
|
import org.dromara.common.redis.utils.RedisUtils;
|
||||||
|
|
||||||
@@ -23,15 +23,15 @@ import java.util.concurrent.locks.ReentrantLock;
|
|||||||
* @author 秋辞未寒
|
* @author 秋辞未寒
|
||||||
*/
|
*/
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class S3StorageClientFactory {
|
public class OssFactory {
|
||||||
|
|
||||||
private static final Map<String, S3StorageClient> CLIENT_CACHE = new ConcurrentHashMap<>();
|
private static final Map<String, OssClient> CLIENT_CACHE = new ConcurrentHashMap<>();
|
||||||
private static final ReentrantLock LOCK = new ReentrantLock();
|
private static final ReentrantLock LOCK = new ReentrantLock();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取默认实例
|
* 获取默认实例
|
||||||
*/
|
*/
|
||||||
public static S3StorageClient instance() {
|
public static OssClient instance() {
|
||||||
// 获取redis 默认类型
|
// 获取redis 默认类型
|
||||||
String configKey = RedisUtils.getCacheObject(OssConstant.DEFAULT_CONFIG_KEY);
|
String configKey = RedisUtils.getCacheObject(OssConstant.DEFAULT_CONFIG_KEY);
|
||||||
if (StringUtils.isEmpty(configKey)) {
|
if (StringUtils.isEmpty(configKey)) {
|
||||||
@@ -43,18 +43,18 @@ public class S3StorageClientFactory {
|
|||||||
/**
|
/**
|
||||||
* 根据类型获取实例
|
* 根据类型获取实例
|
||||||
*/
|
*/
|
||||||
public static S3StorageClient instance(String configKey) {
|
public static OssClient instance(String configKey) {
|
||||||
String json = CacheUtils.get(CacheNames.SYS_OSS_CONFIG, configKey);
|
String json = CacheUtils.get(CacheNames.SYS_OSS_CONFIG, configKey);
|
||||||
if (json == null) {
|
if (json == null) {
|
||||||
throw S3StorageException.form("系统异常, '" + configKey + "'配置信息不存在!");
|
throw S3StorageException.form("系统异常, '" + configKey + "'配置信息不存在!");
|
||||||
}
|
}
|
||||||
OssProperties properties = JsonUtils.parseObject(json, OssProperties.class);
|
OssProperties properties = JsonUtils.parseObject(json, OssProperties.class);
|
||||||
S3StorageClientConfig config = S3StorageClientConfig.formProperties(properties);
|
OssClientConfig config = OssClientConfig.formProperties(properties);
|
||||||
LOCK.lock();
|
LOCK.lock();
|
||||||
try {
|
try {
|
||||||
// 如果已经存在,则校验配置一致性
|
// 如果已经存在,则校验配置一致性
|
||||||
if (CLIENT_CACHE.containsKey(configKey)) {
|
if (CLIENT_CACHE.containsKey(configKey)) {
|
||||||
S3StorageClient client = CLIENT_CACHE.get(configKey);
|
OssClient client = CLIENT_CACHE.get(configKey);
|
||||||
if (!client.verifyConfig(config)) {
|
if (!client.verifyConfig(config)) {
|
||||||
// 配置不一致,刷新配置
|
// 配置不一致,刷新配置
|
||||||
client.refresh(config);
|
client.refresh(config);
|
||||||
@@ -62,7 +62,7 @@ public class S3StorageClientFactory {
|
|||||||
}
|
}
|
||||||
return client;
|
return client;
|
||||||
}
|
}
|
||||||
DefaultS3StorageClientImpl client = new DefaultS3StorageClientImpl(configKey,config);
|
DefaultOssClientImpl client = new DefaultOssClientImpl(configKey, config);
|
||||||
CLIENT_CACHE.put(configKey, client);
|
CLIENT_CACHE.put(configKey, client);
|
||||||
return client;
|
return client;
|
||||||
} finally {
|
} finally {
|
||||||
@@ -74,7 +74,7 @@ public class S3StorageClientFactory {
|
|||||||
* 移除实例
|
* 移除实例
|
||||||
*/
|
*/
|
||||||
public static boolean remove(String configKey) {
|
public static boolean remove(String configKey) {
|
||||||
S3StorageClient client = CLIENT_CACHE.remove(configKey);
|
OssClient client = CLIENT_CACHE.remove(configKey);
|
||||||
if (client == null) {
|
if (client == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -21,6 +21,7 @@ import org.dromara.common.core.utils.file.FileUtils;
|
|||||||
import org.dromara.common.json.utils.JsonUtils;
|
import org.dromara.common.json.utils.JsonUtils;
|
||||||
import org.dromara.common.mybatis.core.page.PageQuery;
|
import org.dromara.common.mybatis.core.page.PageQuery;
|
||||||
import org.dromara.common.oss.client.S3StorageClient;
|
import org.dromara.common.oss.client.S3StorageClient;
|
||||||
|
import org.dromara.common.oss.factory.OssFactory;
|
||||||
import org.dromara.common.oss.model.GetObjectResult;
|
import org.dromara.common.oss.model.GetObjectResult;
|
||||||
import org.dromara.common.oss.model.PutObjectResult;
|
import org.dromara.common.oss.model.PutObjectResult;
|
||||||
import org.dromara.common.oss.enums.AccessPolicy;
|
import org.dromara.common.oss.enums.AccessPolicy;
|
||||||
@@ -212,7 +213,7 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
|
|||||||
}
|
}
|
||||||
String originalfileName = file.getOriginalFilename();
|
String originalfileName = file.getOriginalFilename();
|
||||||
String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length());
|
String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length());
|
||||||
S3StorageClient instance = S3StorageClientFactory.instance();
|
S3StorageClient instance = OssFactory.instance();
|
||||||
try {
|
try {
|
||||||
String pathKey = S3ObjectUtil.buildPathKey(originalfileName);
|
String pathKey = S3ObjectUtil.buildPathKey(originalfileName);
|
||||||
PutObjectResult result = instance.upload(pathKey, file.getInputStream(), file.getSize());
|
PutObjectResult result = instance.upload(pathKey, file.getInputStream(), file.getSize());
|
||||||
|
|||||||
Reference in New Issue
Block a user