diff --git a/yudao-module-infra/yudao-module-infra-biz/pom.xml b/yudao-module-infra/yudao-module-infra-biz/pom.xml
index f2840cfc7a..9786c000dd 100644
--- a/yudao-module-infra/yudao-module-infra-biz/pom.xml
+++ b/yudao-module-infra/yudao-module-infra-biz/pom.xml
@@ -116,8 +116,8 @@
jsch
- io.minio
- minio
+ com.amazonaws
+ aws-java-sdk-s3
diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/framework/file/core/client/s3/S3FileClient.java b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/framework/file/core/client/s3/S3FileClient.java
index 29f6fc34f9..7b84b6941e 100644
--- a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/framework/file/core/client/s3/S3FileClient.java
+++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/framework/file/core/client/s3/S3FileClient.java
@@ -4,10 +4,17 @@ import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.iocoder.yudao.module.infra.framework.file.core.client.AbstractFileClient;
-import io.minio.*;
-import io.minio.http.Method;
+import com.amazonaws.HttpMethod;
+import com.amazonaws.auth.AWSStaticCredentialsProvider;
+import com.amazonaws.auth.BasicAWSCredentials;
+import com.amazonaws.client.builder.AwsClientBuilder;
+import com.amazonaws.services.s3.*;
+import com.amazonaws.services.s3.model.ObjectMetadata;
+import com.amazonaws.services.s3.model.S3Object;
+
import java.io.ByteArrayInputStream;
+import java.util.Date;
import java.util.concurrent.TimeUnit;
/**
@@ -19,7 +26,7 @@ import java.util.concurrent.TimeUnit;
*/
public class S3FileClient extends AbstractFileClient {
- private MinioClient client;
+ private AmazonS3Client client;
public S3FileClient(Long id, S3FileClientConfig config) {
super(id, config);
@@ -32,26 +39,57 @@ public class S3FileClient extends AbstractFileClient {
config.setDomain(buildDomain());
}
// 初始化客户端
- client = MinioClient.builder()
- .endpoint(buildEndpointURL()) // Endpoint URL
- .region(buildRegion()) // Region
- .credentials(config.getAccessKey(), config.getAccessSecret()) // 认证密钥
+
+ client = (AmazonS3Client)AmazonS3ClientBuilder.standard()
+ .withCredentials(buildCredentials())
+ .withEndpointConfiguration(buildEndpointConfiguration())
.build();
- enableVirtualStyleEndpoint();
+
+// enableVirtualStyleEndpoint();
+
+// client = AmazonS3ClientBuilder.builder()
+// .endpoint(buildEndpointURL()) // Endpoint URL
+// .region(buildRegion()) // Region
+// .credentials(config.getAccessKey(), config.getAccessSecret()) // 认证密钥
+// .build();
+// enableVirtualStyleEndpoint();
+ }
+ /**
+ * 基于config秘钥 构建 S3 客户端的认证信息
+ *
+ * @return S3 客户端的认证信息
+ */
+ private AWSStaticCredentialsProvider buildCredentials() {
+ AWSStaticCredentialsProvider awsStaticCredentialsProvider = new AWSStaticCredentialsProvider(
+ new BasicAWSCredentials(config.getAccessKey(), config.getAccessSecret()));
+ return awsStaticCredentialsProvider;
+ }
+ /**
+ * 构建 S3 客户端的 Endpoint 配置包括 region、endpoint
+ *
+ * @return S3 客户端的 EndpointConfiguration 配置
+ */
+ private AwsClientBuilder.EndpointConfiguration buildEndpointConfiguration() {
+ AwsClientBuilder.EndpointConfiguration endpointConfiguration = new AwsClientBuilder.EndpointConfiguration(
+ config.getEndpoint(), buildRegion());
+ return endpointConfiguration;
}
- /**
- * 基于 endpoint 构建调用云服务的 URL 地址
- *
- * @return URI 地址
- */
- private String buildEndpointURL() {
- // 如果已经是 http 或者 https,则不进行拼接.主要适配 MinIO
- if (HttpUtil.isHttp(config.getEndpoint()) || HttpUtil.isHttps(config.getEndpoint())) {
- return config.getEndpoint();
- }
- return StrUtil.format("https://{}", config.getEndpoint());
- }
+
+
+
+// /**
+// * 基于 endpoint 构建调用云服务的 URL 地址
+// *
+// * @return URI 地址
+// */
+// private String buildEndpointURL() {
+// // 如果已经是 http 或者 https,则不进行拼接.主要适配 MinIO
+// if (HttpUtil.isHttp(config.getEndpoint()) || HttpUtil.isHttps(config.getEndpoint())) {
+// return config.getEndpoint();
+// }
+// return StrUtil.format("https://{}", config.getEndpoint());
+// }
/**
* 基于 bucket + endpoint 构建访问的 Domain 地址
@@ -88,55 +126,69 @@ public class S3FileClient extends AbstractFileClient {
}
/**
- * 开启 VirtualStyle 模式
+ * 开启 PathStyle模式
*/
private void enableVirtualStyleEndpoint() {
- if (StrUtil.containsAny(config.getEndpoint(),
- S3FileClientConfig.ENDPOINT_TENCENT, // 腾讯云 https://cloud.tencent.com/document/product/436/41284
- S3FileClientConfig.ENDPOINT_VOLCES)) { // 火山云 https://www.volcengine.com/docs/6349/1288493
- client.enableVirtualStyleEndpoint();
- }
+// if (StrUtil.containsAny(config.getEndpoint(),
+// S3FileClientConfig.ENDPOINT_TENCENT, // 腾讯云 https://cloud.tencent.com/document/product/436/41284
+// S3FileClientConfig.ENDPOINT_VOLCES)) { // 火山云 https://www.volcengine.com/docs/6349/1288493
+//
+// }
+ S3ClientOptions clientOptions = S3ClientOptions.builder()
+ .setPathStyleAccess(true)
+ .build();
}
@Override
public String upload(byte[] content, String path, String type) throws Exception {
// 执行上传
- client.putObject(PutObjectArgs.builder()
- .bucket(config.getBucket()) // bucket 必须传递
- .contentType(type)
- .object(path) // 相对路径作为 key
- .stream(new ByteArrayInputStream(content), content.length, -1) // 文件内容
- .build());
+ ObjectMetadata objectMetadata = new ObjectMetadata();
+ objectMetadata.setContentType(type);
+
+ client.putObject(config.getBucket(), path, new ByteArrayInputStream(content), objectMetadata);
+// client.putObject(PutObjectArgs.builder()
+// .bucket(config.getBucket()) // bucket 必须传递
+// .contentType(type)
+// .object(path) // 相对路径作为 key
+// .stream(new ByteArrayInputStream(content), content.length, -1) // 文件内容
+// .build());
// 拼接返回路径
return config.getDomain() + "/" + path;
}
@Override
public void delete(String path) throws Exception {
- client.removeObject(RemoveObjectArgs.builder()
- .bucket(config.getBucket()) // bucket 必须传递
- .object(path) // 相对路径作为 key
- .build());
+
+ client.deleteObject(config.getBucket(), path);
+
+// client.removeObject(RemoveObjectArgs.builder()
+// .bucket(config.getBucket()) // bucket 必须传递
+// .object(path) // 相对路径作为 key
+// .build());
}
@Override
public byte[] getContent(String path) throws Exception {
- GetObjectResponse response = client.getObject(GetObjectArgs.builder()
- .bucket(config.getBucket()) // bucket 必须传递
- .object(path) // 相对路径作为 key
- .build());
- return IoUtil.readBytes(response);
+ S3Object tempS3Object = client.getObject(config.getBucket(), path);
+// GetObjectResponse response = client.getObject(GetObjectArgs.builder()
+// .bucket(config.getBucket()) // bucket 必须传递
+// .object(path) // 相对路径作为 key
+// .build());
+ return IoUtil.readBytes(tempS3Object.getObjectContent());
}
@Override
public FilePresignedUrlRespDTO getPresignedObjectUrl(String path) throws Exception {
- String uploadUrl = client.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
- .method(Method.PUT)
- .bucket(config.getBucket())
- .object(path)
- .expiry(10, TimeUnit.MINUTES) // 过期时间(秒数)取值范围:1 秒 ~ 7 天
- .build()
- );
+ //设定过期时间为24小时
+ Date expiration = new Date(System.currentTimeMillis() + TimeUnit.HOURS.toMillis(24));
+ String uploadUrl = String.valueOf(client.generatePresignedUrl(config.getBucket(), path,expiration , HttpMethod.PUT));
+// String uploadUrl = client.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
+// .method(Method.PUT)
+// .bucket(config.getBucket())
+// .object(path)
+// .expiry(10, TimeUnit.MINUTES) // 过期时间(秒数)取值范围:1 秒 ~ 7 天
+// .build()
+// );
return new FilePresignedUrlRespDTO(uploadUrl, config.getDomain() + "/" + path);
}