From b9461fd1ec44382c27ea35c66970d5ba14b64056 Mon Sep 17 00:00:00 2001
From: liusuyi <1951119284@qq.com>
Date: Mon, 13 Oct 2025 14:23:12 +0800
Subject: [PATCH] 增加存储模块
---
ard-admin/src/main/java/com/ard/web/controller/storage/FileUploadController.java | 69 ++++
ard-sample/src/main/java/com/ard/sample/wayline/service/impl/WaylineFileServiceImpl.java | 4
ard-admin/src/main/java/com/ard/web/controller/common/CommonController.java | 48 ---
ard-oss/src/main/java/com/ard/oss/service/impl/AmazonS3ServiceImpl.java | 64 ++--
ard-oss/src/main/java/com/ard/oss/service/impl/OssServiceContext.java | 165 +++++++++++
ard-oss/src/main/java/com/ard/oss/service/impl/AliyunOssServiceImpl.java | 9
ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceLogsServiceImpl.java | 2
ard-oss/src/main/java/com/ard/oss/model/MinioUploadResult.java | 3
ard-work/src/main/java/com/ard/work/service/impl/KmzFileServiceImpl.java | 11
ard-sample/src/main/java/com/ard/sample/storage/service/IStorageService.java | 2
ard-oss/src/main/java/com/ard/oss/config/OssConfiguration.java | 94 ++++++
pom.xml | 10
ard-admin/src/main/java/com/ard/web/core/config/SwaggerConfig.java | 8
ard-sample/src/main/java/com/ard/sample/manage/model/dto/LogsUploadCredentialsDTO.java | 4
ard-oss/src/main/java/com/ard/oss/model/enums/OssTypeEnum.java | 2
ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceFirmwareServiceImpl.java | 4
ard-oss/src/main/java/com/ard/oss/service/impl/OssAspectHandler.java | 4
ard-common/src/main/java/com/ard/common/utils/file/FileUploadUtils.java | 54 ---
ard-oss/src/main/java/com/ard/oss/model/StsCredentialsDTO.java | 2
ard-oss/src/main/java/com/ard/oss/model/CredentialsDTO.java | 2
ard-sample/src/main/java/com/ard/sample/manage/service/impl/LogsFileServiceImpl.java | 5
ard-work/pom.xml | 4
/dev/null | 68 ----
ard-sample/pom.xml | 37 --
ard-oss/src/main/java/com/ard/oss/service/impl/MinIOServiceImpl.java | 73 +++-
ard-sample/src/main/java/com/ard/sample/storage/service/impl/StorageServiceImpl.java | 6
ard-oss/pom.xml | 70 +++++
ard-sample/src/main/java/com/ard/sample/component/websocket/config/AuthPrincipalHandler.java | 3
ard-sample/src/main/java/com/ard/sample/media/service/impl/FileServiceImpl.java | 5
ard-oss/src/main/java/com/ard/oss/service/IOssService.java | 6
30 files changed, 538 insertions(+), 300 deletions(-)
diff --git a/ard-admin/src/main/java/com/ard/web/controller/common/CommonController.java b/ard-admin/src/main/java/com/ard/web/controller/common/CommonController.java
index d8fd6fe..9ba658c 100644
--- a/ard-admin/src/main/java/com/ard/web/controller/common/CommonController.java
+++ b/ard-admin/src/main/java/com/ard/web/controller/common/CommonController.java
@@ -5,10 +5,7 @@
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
-import com.ard.common.core.domain.entity.MinioUploadResult;
-import com.ard.work.domain.entity.MinioSysFile;
import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -22,8 +19,6 @@
import com.ard.common.utils.file.FileUploadUtils;
import com.ard.common.utils.file.FileUtils;
import com.ard.framework.config.ServerConfig;
-
-import static com.ard.common.utils.file.MinioUtil.uploadFile;
/**
* 通用请求处理
@@ -166,48 +161,5 @@
}
}
-
- /**
- * minio上传文件
- */
- @ApiOperation("minio文件上传")
- @PostMapping("/uploadMinio")
- public AjaxResult uploadFileMinio(@RequestPart MultipartFile file) {
- try
- {
- // 上传并返回新文件名称
- String url = FileUploadUtils.uploadMinio(file);
- MinioUploadResult minioUploadResult = MinioUploadResult.builder()
- .url(url)
- .newFileName(FileUtils.getName(url))
- .originalFilename(file.getOriginalFilename())
- .build();
- return AjaxResult.success(minioUploadResult);
- }
- catch (Exception e)
- {
- return AjaxResult.error(e.getMessage());
- }
- }
- /**
- * minio文件上传-指定桶
- */
- @ApiOperation("minio文件上传-指定桶")
- @PostMapping("/uploadMinio/{bucketName}")
- public AjaxResult upload(@RequestPart("file")MultipartFile file,
- @PathVariable String bucketName) {
- try {
- // 上传并返回访问地址
- String url = FileUploadUtils.uploadMinio(file,bucketName);
- MinioUploadResult minioUploadResult = MinioUploadResult.builder()
- .url(url)
- .newFileName(FileUtils.getName(url))
- .originalFilename(file.getOriginalFilename())
- .build();
- return AjaxResult.success(minioUploadResult);
- } catch (Exception e) {
- return AjaxResult.error(e.getMessage());
- }
- }
}
diff --git a/ard-admin/src/main/java/com/ard/web/controller/sample/storage/StorageController.java b/ard-admin/src/main/java/com/ard/web/controller/sample/storage/StorageController.java
deleted file mode 100644
index 8e0befc..0000000
--- a/ard-admin/src/main/java/com/ard/web/controller/sample/storage/StorageController.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.ard.web.controller.sample.storage;
-
-import com.ard.sample.common.model.ResponseResult;
-import com.ard.sample.media.model.StsCredentialsDTO;
-import com.ard.sample.storage.service.IStorageService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-/**
- * @author sean
- * @version 0.3
- * @date 2021/12/29
- */
-@RestController
-@RequestMapping("/dock/storage/workspaces/")
-public class StorageController {
-
- @Autowired
- private IStorageService storageService;
-
- /**
- * Get temporary credentials for uploading the media and wayline in DJI Pilot.
- * @param workspaceId
- * @return
- */
- @PostMapping("/{workspace_id}/sts")
- public ResponseResult<StsCredentialsDTO> getSTSCredentials(@PathVariable(name = "workspace_id") String workspaceId) {
-
- StsCredentialsDTO stsCredentials = storageService.getSTSCredentials();
- return ResponseResult.success(stsCredentials);
- }
-
-}
diff --git a/ard-admin/src/main/java/com/ard/web/controller/storage/FileUploadController.java b/ard-admin/src/main/java/com/ard/web/controller/storage/FileUploadController.java
new file mode 100644
index 0000000..c09d70e
--- /dev/null
+++ b/ard-admin/src/main/java/com/ard/web/controller/storage/FileUploadController.java
@@ -0,0 +1,69 @@
+package com.ard.web.controller.storage;
+
+import com.ard.common.core.domain.AjaxResult;
+import com.ard.oss.model.MinioUploadResult;
+import com.ard.common.utils.file.FileUtils;
+import com.ard.oss.service.impl.OssServiceContext;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.annotation.Resource;
+
+/**
+ * 文件上传管理接口
+ *
+ * @author ruoyi
+ */
+@Api(tags = "文件上传管理接口")
+@RestController
+@RequestMapping("/common")
+public class FileUploadController {
+
+ @Resource
+ private OssServiceContext ossService;
+
+ /**
+ * minio上传文件
+ */
+ @ApiOperation("minio文件上传")
+ @PostMapping("/uploadMinio")
+ public AjaxResult uploadFileMinio(@RequestPart MultipartFile file) {
+ try {
+ // 上传并返回新文件名称
+ String url = ossService.upload(file);
+ MinioUploadResult minioUploadResult = MinioUploadResult.builder()
+ .url(url)
+ .newFileName(FileUtils.getName(url))
+ .originalFilename(file.getOriginalFilename())
+ .build();
+ return AjaxResult.success(minioUploadResult);
+ } catch (Exception e) {
+ return AjaxResult.error(e.getMessage());
+ }
+ }
+
+ /**
+ * minio文件上传-指定桶
+ */
+ @ApiOperation("minio文件上传-指定桶")
+ @PostMapping("/uploadMinio/{bucketName}")
+ public AjaxResult upload(@RequestPart("file") MultipartFile file,
+ @PathVariable String bucketName) {
+ try {
+ // 上传并返回访问地址
+ String url = ossService.upload(bucketName,file);
+ MinioUploadResult minioUploadResult = MinioUploadResult.builder()
+ .url(url)
+ .newFileName(FileUtils.getName(url))
+ .originalFilename(file.getOriginalFilename())
+ .build();
+ return AjaxResult.success(minioUploadResult);
+ } catch (Exception e) {
+ return AjaxResult.error(e.getMessage());
+ }
+ }
+
+}
diff --git a/ard-admin/src/main/java/com/ard/web/core/config/SwaggerConfig.java b/ard-admin/src/main/java/com/ard/web/core/config/SwaggerConfig.java
index ec9e1f9..71ef983 100644
--- a/ard-admin/src/main/java/com/ard/web/core/config/SwaggerConfig.java
+++ b/ard-admin/src/main/java/com/ard/web/core/config/SwaggerConfig.java
@@ -149,16 +149,16 @@
.securityContexts(securityContexts());
}
@Bean
- public Docket commonApi() {
+ public Docket storageApi() {
return new Docket(DocumentationType.SWAGGER_2)
.enable(true)
- .groupName("公共请求接口") // 分组名
- .apiInfo(apiInfo("公共请求管理接口"))
+ .groupName("存储接口") // 分组名
+ .apiInfo(apiInfo("存储管理接口"))
.select()
// 扫描指定包下,但只扫描加了 @ApiOperation 注解的方法
.apis(requestHandler ->
requestHandler.declaringClass().getPackage().getName().startsWith("com.ard.web.controller" +
- ".common") &&
+ ".storage") &&
requestHandler.isAnnotatedWith(io.swagger.annotations.ApiOperation.class)
)
.paths(PathSelectors.any())
diff --git a/ard-common/src/main/java/com/ard/common/config/OssConfiguration.java b/ard-common/src/main/java/com/ard/common/config/OssConfiguration.java
deleted file mode 100644
index 7e62abc..0000000
--- a/ard-common/src/main/java/com/ard/common/config/OssConfiguration.java
+++ /dev/null
@@ -1,129 +0,0 @@
-package com.ard.common.config;
-
-import io.minio.MinioClient;
-import okhttp3.OkHttpClient;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.stereotype.Component;
-
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.X509TrustManager;
-import java.security.KeyManagementException;
-import java.security.NoSuchAlgorithmException;
-import java.security.cert.X509Certificate;
-
-/**
- * @author sean
- * @version 0.2
- * @date 2021/12/9
- */
-@Component
-@ConfigurationProperties(prefix = "oss")
-public class OssConfiguration {
-
- /**
- * @see com.ard.sample.component.oss.model.enums.OssTypeEnum
- */
- public static String provider;
-
- /**
- * Whether to use the object storage service.
- */
- public static boolean enable;
-
- /**
- * The protocol needs to be included at the beginning of the address.
- */
- public static String endpoint;
-
- public static String accessKey;
-
- public static String secretKey;
-
- public static String region;
-
- public static Long expire;
-
- public static String roleSessionName;
-
- public static String roleArn;
-
- public static String bucket;
-
- public static String objectDirPrefix;
-
- public void setProvider(String provider) {
- OssConfiguration.provider = provider;
- }
-
- public void setEnable(boolean enable) {
- OssConfiguration.enable = enable;
- }
-
- public void setEndpoint(String endpoint) {
- OssConfiguration.endpoint = endpoint;
- }
-
- public void setAccessKey(String accessKey) {
- OssConfiguration.accessKey = accessKey;
- }
-
- public void setSecretKey(String secretKey) {
- OssConfiguration.secretKey = secretKey;
- }
-
- public void setRegion(String region) {
- OssConfiguration.region = region;
- }
-
- public void setExpire(Long expire) {
- OssConfiguration.expire = expire;
- }
-
- public void setRoleSessionName(String roleSessionName) {
- OssConfiguration.roleSessionName = roleSessionName;
- }
-
- public void setRoleArn(String roleArn) {
- OssConfiguration.roleArn = roleArn;
- }
-
- public void setBucket(String bucket) {
- OssConfiguration.bucket = bucket;
- }
-
- public void setObjectDirPrefix(String objectDirPrefix) {
- OssConfiguration.objectDirPrefix = objectDirPrefix;
- }
-
-
- @Bean
- public MinioClient getMinioClient() throws KeyManagementException, NoSuchAlgorithmException {// 忽略 SSL 证书校验(仅开发环境)
- // 忽略 SSL 验证
- TrustManager[] trustAllCerts = new TrustManager[]{
- new X509TrustManager() {
- @Override public void checkClientTrusted(X509Certificate[] chain, String authType) {}
- @Override public void checkServerTrusted(X509Certificate[] chain, String authType) {}
- @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; }
- }
- };
-
- SSLContext sslContext = SSLContext.getInstance("TLS");
- sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
-
- OkHttpClient okHttpClient = new OkHttpClient.Builder()
- .sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager)trustAllCerts[0])
- .hostnameVerifier((hostname, session) -> true)
- .build();
-
- return MinioClient.builder()
- .endpoint(endpoint)
- .credentials(accessKey, secretKey)
- .httpClient(okHttpClient)
- .build();
- }
-}
-
-
-
diff --git a/ard-common/src/main/java/com/ard/common/utils/file/FileUploadUtils.java b/ard-common/src/main/java/com/ard/common/utils/file/FileUploadUtils.java
index 1a0727d..bb5976b 100644
--- a/ard-common/src/main/java/com/ard/common/utils/file/FileUploadUtils.java
+++ b/ard-common/src/main/java/com/ard/common/utils/file/FileUploadUtils.java
@@ -5,7 +5,6 @@
import java.nio.file.Paths;
import java.util.Objects;
-import com.ard.common.config.OssConfiguration;
import com.ard.common.config.UavConfig;
import com.ard.common.constant.Constants;
import com.ard.common.exception.file.FileNameLengthLimitExceededException;
@@ -38,10 +37,6 @@
*/
private static String defaultBaseDir = UavConfig.getProfile();
- /**
- * Minio默认上传的地址
- */
- private static String bucketName = OssConfiguration.bucket;
public static void setDefaultBaseDir(String defaultBaseDir) {
FileUploadUtils.defaultBaseDir = defaultBaseDir;
@@ -51,9 +46,6 @@
return defaultBaseDir;
}
- public static String getBucketName() {
- return bucketName;
- }
/**
* 以默认配置进行文件上传
@@ -115,52 +107,6 @@
return getPathFileName(baseDir, fileName);
}
- /**
- * 以默认BucketName配置上传到Minio服务器
- *
- * @param file 上传的文件
- * @return 文件名称
- * @throws Exception
- */
- public static final String uploadMinio(MultipartFile file) throws IOException {
- try {
- return uploadMinino(getBucketName(), file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
- } catch (Exception e) {
- throw new IOException(e.getMessage(), e);
- }
- }
-
- /**
- * 自定义bucketName配置上传到Minio服务器
- *
- * @param file 上传的文件
- * @return 文件名称
- * @throws Exception
- */
- public static final String uploadMinio(MultipartFile file, String bucketName) throws IOException {
- try {
- return uploadMinino(bucketName, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
- } catch (Exception e) {
- throw new IOException(e.getMessage(), e);
- }
- }
-
- private static String uploadMinino(String bucketName, MultipartFile file, String[] allowedExtension)
- throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
- InvalidExtensionException {
- int fileNamelength = file.getOriginalFilename().length();
- if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) {
- throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
- }
- assertAllowed(file, allowedExtension);
- try {
- String fileName = extractFilename(file);
- String pathFileName = MinioUtil.uploadFile(bucketName, fileName, file);
- return pathFileName;
- } catch (Exception e) {
- throw new IOException(e.getMessage(), e);
- }
- }
/**
* 编码文件名
diff --git a/ard-common/src/main/java/com/ard/common/utils/file/MinioUtil.java b/ard-common/src/main/java/com/ard/common/utils/file/MinioUtil.java
deleted file mode 100644
index 9c2aa55..0000000
--- a/ard-common/src/main/java/com/ard/common/utils/file/MinioUtil.java
+++ /dev/null
@@ -1,221 +0,0 @@
-package com.ard.common.utils.file;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import com.ard.common.utils.ServletUtils;
-import com.ard.common.utils.spring.SpringUtils;
-import io.minio.SetBucketPolicyArgs;
-import org.springframework.web.multipart.MultipartFile;
-import io.minio.GetPresignedObjectUrlArgs;
-import io.minio.MinioClient;
-import io.minio.PutObjectArgs;
-import io.minio.http.Method;
-
-/**
- * Minio 文件存储工具类
- *
- * @author ruoyi
- */
-public class MinioUtil
-{
-
- /**
- * 判断桶是否存在
- *
- * @param bucketName 桶名称
- * @return 如果桶存在返回 true,否则返回 false
- * @throws IOException
- */
- public static boolean bucketExists(String bucketName) throws IOException {
- MinioClient minioClient = SpringUtils.getBean(MinioClient.class);
- try {
- return minioClient.bucketExists(io.minio.BucketExistsArgs.builder().bucket(bucketName).build());
- } catch (Exception e) {
- throw new IOException("Error checking if bucket exists", e);
- }
- }
-
- // 创建桶
- public static void createBucket(String bucketName) throws IOException {
- MinioClient minioClient = SpringUtils.getBean(MinioClient.class);
- try {
- minioClient.makeBucket(io.minio.MakeBucketArgs.builder().bucket(bucketName).build());
- setBucketPolicy(bucketName);
- } catch (Exception e) {
- throw new IOException("Error creating bucket", e);
- }
- }
-
-
- /**
- * 设置桶策略
- * 刘苏义
- * 2023/9/20 10:01:39
- */
- public static boolean setBucketPolicy(String bucket) throws Exception {
- MinioClient minioClient = SpringUtils.getBean(MinioClient.class);
- try {
- //设置策略
- String sb = "{\"Version\":\"2012-10-17\"," +
- "\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":" +
- "{\"AWS\":[\"*\"]},\"Action\":[\"s3:ListBucket\",\"s3:ListBucketMultipartUploads\"," +
- "\"s3:GetBucketLocation\"],\"Resource\":[\"arn:aws:s3:::" + bucket +
- "\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:PutObject\",\"s3:AbortMultipartUpload\",\"s3:DeleteObject\",\"s3:GetObject\",\"s3:ListMultipartUploadParts\"],\"Resource\":[\"arn:aws:s3:::" +
- bucket + "/*\"]}]}";
- SetBucketPolicyArgs setBucketPolicyArgs = SetBucketPolicyArgs.builder()
- .bucket(bucket)
- .config(sb)
- .build();
- minioClient.setBucketPolicy(setBucketPolicyArgs);
- return true;
- } catch (Exception ex) {
- throw new Exception("设置桶策略异常:" + ex.getMessage());
- }
- }
-
-
- /**
- * 上传文件
- *
- * @param bucketName 桶名称
- * @param fileName 文件名
- * @throws IOException
- */
- public static String uploadFile(String bucketName, String fileName, MultipartFile multipartFile) throws IOException {
- String url = "";
- MinioClient minioClient = SpringUtils.getBean(MinioClient.class);
- try (InputStream inputStream = multipartFile.getInputStream()) {
- minioClient.putObject(PutObjectArgs.builder().
- bucket(bucketName).
- object(fileName).
- stream(inputStream,multipartFile.getSize(), -1).
- contentType(multipartFile.getContentType()).
- build());
- url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder().
- bucket(bucketName).
- object(fileName).
- method(Method.GET).
- build());
- url = url.substring(0, url.indexOf('?'));
- return ServletUtils.urlDecode(url);
- } catch (Exception e) {
- throw new IOException(e.getMessage(), e);
- }
- }
-
- /**
- * 上传本地文件
- *
- * @param bucketName 桶名称
- * @param fileName 存储到 Minio 的文件名
- * @param localFilePath 本地文件绝对路径
- * @return 访问 URL
- * @throws IOException
- */
- public static String uploadLocalFile(String bucketName, String fileName, String localFilePath) throws IOException {
- MinioClient minioClient = SpringUtils.getBean(MinioClient.class);
- try (InputStream inputStream = new FileInputStream(localFilePath)) {
- File file = new File(localFilePath);
- minioClient.putObject(
- PutObjectArgs.builder()
- .bucket(bucketName)
- .object(fileName)
- .stream(inputStream, file.length(), -1)
- .contentType("application/octet-stream") // 可根据需求自行修改
- .build()
- );
- String url = minioClient.getPresignedObjectUrl(
- GetPresignedObjectUrlArgs.builder()
- .bucket(bucketName)
- .object(fileName)
- .method(Method.GET)
- .build()
- );
- return ServletUtils.urlDecode(url.substring(0, url.indexOf('?')));
- } catch (Exception e) {
- throw new IOException(e.getMessage(), e);
- }
- }
-
- public static String uploadInputStream(String bucketName, String fileName, InputStream inputStream, long size,
- String contentType) throws IOException {
- MinioClient minioClient = SpringUtils.getBean(MinioClient.class);
- if (!bucketExists(bucketName)) {
- createBucket(bucketName);
- }
- try {
- minioClient.putObject(
- PutObjectArgs.builder()
- .bucket(bucketName)
- .object(fileName)
- .stream(inputStream, size, -1)
- .contentType(contentType)
- .build()
- );
-
- String url = minioClient.getPresignedObjectUrl(
- GetPresignedObjectUrlArgs.builder()
- .bucket(bucketName)
- .object(fileName)
- .method(Method.GET)
- .build()
- );
- url = url.substring(0, url.indexOf('?'));
- return ServletUtils.urlDecode(url);
- } catch (Exception e) {
- throw new IOException(e.getMessage(), e);
- } finally {
- if (inputStream != null) {
- try {
- inputStream.close();
- } catch (IOException ignore) {
- }
- }
- }
- }
-
- /**
- * 判断文件是否存在
- */
- public static boolean exists(String bucketName, String fileName) throws IOException {
- MinioClient minioClient = SpringUtils.getBean(MinioClient.class);
- if (!bucketExists(bucketName)) {
- createBucket(bucketName);
- }
- try {
- minioClient.statObject(
- io.minio.StatObjectArgs.builder()
- .bucket(bucketName)
- .object(fileName)
- .build()
- );
- return true;
- } catch (io.minio.errors.ErrorResponseException e) {
- if ("NoSuchKey".equals(e.errorResponse().code()) || "NoSuchObject".equals(e.errorResponse().code())) {
- return false;
- }
- throw new IOException(e.getMessage(), e);
- } catch (Exception e) {
- throw new IOException(e.getMessage(), e);
- }
- }
-
- /**
- * 删除文件
- */
- public static void delete(String bucketName, String fileName) throws IOException {
- MinioClient minioClient = SpringUtils.getBean(MinioClient.class);
- try {
- minioClient.removeObject(
- io.minio.RemoveObjectArgs.builder()
- .bucket(bucketName)
- .object(fileName)
- .build()
- );
- } catch (Exception e) {
- throw new IOException(e.getMessage(), e);
- }
- }
-}
diff --git a/ard-oss/pom.xml b/ard-oss/pom.xml
new file mode 100644
index 0000000..6e3504c
--- /dev/null
+++ b/ard-oss/pom.xml
@@ -0,0 +1,70 @@
+<?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">
+ <parent>
+ <artifactId>ard</artifactId>
+ <groupId>com.ard</groupId>
+ <version>3.8.8</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+ <artifactId>ard-oss</artifactId>
+
+ <description>
+ 存储模块
+ </description>
+ <properties>
+ <aliyun-sdk-sts.version>3.1.0</aliyun-sdk-sts.version>
+ <aliyun-oss.version>3.12.0</aliyun-oss.version>
+ </properties>
+ <dependencies>
+ <!-- 通用工具-->
+ <dependency>
+ <groupId>com.ard</groupId>
+ <artifactId>ard-common</artifactId>
+ </dependency>
+
+ <!-- minio依赖-->
+ <dependency>
+ <groupId>io.minio</groupId>
+ <artifactId>minio</artifactId>
+ </dependency>
+
+ <dependency>
+ <groupId>com.amazonaws</groupId>
+ <artifactId>aws-java-sdk-s3</artifactId>
+ <version>1.12.261</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.amazonaws</groupId>
+ <artifactId>aws-java-sdk-sts</artifactId>
+ <version>1.12.261</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.aliyun</groupId>
+ <artifactId>aliyun-java-sdk-sts</artifactId>
+ <version>${aliyun-sdk-sts.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.aliyun.oss</groupId>
+ <artifactId>aliyun-sdk-oss</artifactId>
+ <version>${aliyun-oss.version}</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.projectlombok</groupId>
+ <artifactId>lombok</artifactId>
+ <scope>provided</scope>
+ </dependency>
+
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-aop</artifactId>
+ </dependency>
+ </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/ard-oss/src/main/java/com/ard/oss/config/OssConfiguration.java b/ard-oss/src/main/java/com/ard/oss/config/OssConfiguration.java
new file mode 100644
index 0000000..4d10274
--- /dev/null
+++ b/ard-oss/src/main/java/com/ard/oss/config/OssConfiguration.java
@@ -0,0 +1,94 @@
+package com.ard.common.config;
+
+import com.ard.oss.model.enums.OssTypeEnum;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author sean
+ * @version 0.2
+ * @date 2021/12/9
+ */
+@Component
+@ConfigurationProperties(prefix = "oss")
+public class OssConfiguration {
+
+ /**
+ * @see OssTypeEnum
+ */
+ public static String provider;
+
+ /**
+ * Whether to use the object storage service.
+ */
+ public static boolean enable;
+
+ /**
+ * The protocol needs to be included at the beginning of the address.
+ */
+ public static String endpoint;
+
+ public static String accessKey;
+
+ public static String secretKey;
+
+ public static String region;
+
+ public static Long expire;
+
+ public static String roleSessionName;
+
+ public static String roleArn;
+
+ public static String bucket;
+
+ public static String objectDirPrefix;
+
+ public void setProvider(String provider) {
+ OssConfiguration.provider = provider;
+ }
+
+ public void setEnable(boolean enable) {
+ OssConfiguration.enable = enable;
+ }
+
+ public void setEndpoint(String endpoint) {
+ OssConfiguration.endpoint = endpoint;
+ }
+
+ public void setAccessKey(String accessKey) {
+ OssConfiguration.accessKey = accessKey;
+ }
+
+ public void setSecretKey(String secretKey) {
+ OssConfiguration.secretKey = secretKey;
+ }
+
+ public void setRegion(String region) {
+ OssConfiguration.region = region;
+ }
+
+ public void setExpire(Long expire) {
+ OssConfiguration.expire = expire;
+ }
+
+ public void setRoleSessionName(String roleSessionName) {
+ OssConfiguration.roleSessionName = roleSessionName;
+ }
+
+ public void setRoleArn(String roleArn) {
+ OssConfiguration.roleArn = roleArn;
+ }
+
+ public void setBucket(String bucket) {
+ OssConfiguration.bucket = bucket;
+ }
+
+ public void setObjectDirPrefix(String objectDirPrefix) {
+ OssConfiguration.objectDirPrefix = objectDirPrefix;
+ }
+
+}
+
+
+
diff --git a/ard-sample/src/main/java/com/ard/sample/media/model/CredentialsDTO.java b/ard-oss/src/main/java/com/ard/oss/model/CredentialsDTO.java
similarity index 97%
rename from ard-sample/src/main/java/com/ard/sample/media/model/CredentialsDTO.java
rename to ard-oss/src/main/java/com/ard/oss/model/CredentialsDTO.java
index b00feb4..ef6e563 100644
--- a/ard-sample/src/main/java/com/ard/sample/media/model/CredentialsDTO.java
+++ b/ard-oss/src/main/java/com/ard/oss/model/CredentialsDTO.java
@@ -1,4 +1,4 @@
-package com.ard.sample.media.model;
+package com.ard.oss.model;
import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse;
import io.minio.credentials.Credentials;
diff --git a/ard-common/src/main/java/com/ard/common/core/domain/entity/MinioUploadResult.java b/ard-oss/src/main/java/com/ard/oss/model/MinioUploadResult.java
similarity index 84%
rename from ard-common/src/main/java/com/ard/common/core/domain/entity/MinioUploadResult.java
rename to ard-oss/src/main/java/com/ard/oss/model/MinioUploadResult.java
index a21a958..ff9a5af 100644
--- a/ard-common/src/main/java/com/ard/common/core/domain/entity/MinioUploadResult.java
+++ b/ard-oss/src/main/java/com/ard/oss/model/MinioUploadResult.java
@@ -1,6 +1,5 @@
-package com.ard.common.core.domain.entity;
+package com.ard.oss.model;
-import com.ard.common.annotation.DataScope;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
diff --git a/ard-sample/src/main/java/com/ard/sample/media/model/StsCredentialsDTO.java b/ard-oss/src/main/java/com/ard/oss/model/StsCredentialsDTO.java
similarity index 94%
rename from ard-sample/src/main/java/com/ard/sample/media/model/StsCredentialsDTO.java
rename to ard-oss/src/main/java/com/ard/oss/model/StsCredentialsDTO.java
index c9d2e6f..9a00317 100644
--- a/ard-sample/src/main/java/com/ard/sample/media/model/StsCredentialsDTO.java
+++ b/ard-oss/src/main/java/com/ard/oss/model/StsCredentialsDTO.java
@@ -1,4 +1,4 @@
-package com.ard.sample.media.model;
+package com.ard.oss.model;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
diff --git a/ard-sample/src/main/java/com/ard/sample/component/oss/model/enums/OssTypeEnum.java b/ard-oss/src/main/java/com/ard/oss/model/enums/OssTypeEnum.java
similarity index 85%
rename from ard-sample/src/main/java/com/ard/sample/component/oss/model/enums/OssTypeEnum.java
rename to ard-oss/src/main/java/com/ard/oss/model/enums/OssTypeEnum.java
index df84519..4ba294d 100644
--- a/ard-sample/src/main/java/com/ard/sample/component/oss/model/enums/OssTypeEnum.java
+++ b/ard-oss/src/main/java/com/ard/oss/model/enums/OssTypeEnum.java
@@ -1,4 +1,4 @@
-package com.ard.sample.component.oss.model.enums;
+package com.ard.oss.model.enums;
/**
* @author sean
diff --git a/ard-sample/src/main/java/com/ard/sample/component/oss/service/IOssService.java b/ard-oss/src/main/java/com/ard/oss/service/IOssService.java
similarity index 90%
rename from ard-sample/src/main/java/com/ard/sample/component/oss/service/IOssService.java
rename to ard-oss/src/main/java/com/ard/oss/service/IOssService.java
index 6b24fc2..c2d8224 100644
--- a/ard-sample/src/main/java/com/ard/sample/component/oss/service/IOssService.java
+++ b/ard-oss/src/main/java/com/ard/oss/service/IOssService.java
@@ -1,7 +1,6 @@
-package com.ard.sample.component.oss.service;
+package com.ard.oss.service;
-import com.ard.sample.media.model.CredentialsDTO;
-
+import com.ard.oss.model.CredentialsDTO;
import java.io.InputStream;
import java.net.URL;
@@ -47,4 +46,5 @@
void putObject(String bucket, String objectKey, InputStream input);
void createClient();
+
}
diff --git a/ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/AliyunOssServiceImpl.java b/ard-oss/src/main/java/com/ard/oss/service/impl/AliyunOssServiceImpl.java
similarity index 93%
rename from ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/AliyunOssServiceImpl.java
rename to ard-oss/src/main/java/com/ard/oss/service/impl/AliyunOssServiceImpl.java
index 1c52b51..2e5a941 100644
--- a/ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/AliyunOssServiceImpl.java
+++ b/ard-oss/src/main/java/com/ard/oss/service/impl/AliyunOssServiceImpl.java
@@ -1,4 +1,4 @@
-package com.ard.sample.component.oss.service.impl;
+package com.ard.oss.service.impl;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
@@ -13,9 +13,9 @@
import com.aliyuncs.sts.model.v20150401.AssumeRoleRequest;
import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse;
import com.ard.common.config.OssConfiguration;
-import com.ard.sample.component.oss.model.enums.OssTypeEnum;
-import com.ard.sample.component.oss.service.IOssService;
-import com.ard.sample.media.model.CredentialsDTO;
+import com.ard.oss.model.CredentialsDTO;
+import com.ard.oss.model.enums.OssTypeEnum;
+import com.ard.oss.service.IOssService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -106,4 +106,5 @@
this.ossClient = new OSSClientBuilder()
.build(OssConfiguration.endpoint, OssConfiguration.accessKey, OssConfiguration.secretKey);
}
+
}
diff --git a/ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/AmazonS3ServiceImpl.java b/ard-oss/src/main/java/com/ard/oss/service/impl/AmazonS3ServiceImpl.java
similarity index 72%
rename from ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/AmazonS3ServiceImpl.java
rename to ard-oss/src/main/java/com/ard/oss/service/impl/AmazonS3ServiceImpl.java
index c68d201..0ba005d 100644
--- a/ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/AmazonS3ServiceImpl.java
+++ b/ard-oss/src/main/java/com/ard/oss/service/impl/AmazonS3ServiceImpl.java
@@ -1,30 +1,27 @@
-package com.ard.sample.component.oss.service.impl;
+package com.ard.oss.service.impl;
import com.amazonaws.HttpMethod;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
-import com.amazonaws.services.s3.model.*;
+import com.amazonaws.services.s3.model.ObjectMetadata;
+import com.amazonaws.services.s3.model.PutObjectRequest;
+import com.amazonaws.services.s3.model.PutObjectResult;
import com.amazonaws.services.securitytoken.AWSSecurityTokenService;
import com.amazonaws.services.securitytoken.AWSSecurityTokenServiceClientBuilder;
import com.amazonaws.services.securitytoken.model.AssumeRoleRequest;
import com.amazonaws.services.securitytoken.model.AssumeRoleResult;
import com.amazonaws.services.securitytoken.model.Credentials;
-import com.ard.sample.component.AuthInterceptor;
import com.ard.common.config.OssConfiguration;
-import com.ard.sample.component.oss.model.enums.OssTypeEnum;
-import com.ard.sample.component.oss.service.IOssService;
-import com.ard.sample.media.model.CredentialsDTO;
+import com.ard.oss.model.CredentialsDTO;
+import com.ard.oss.model.enums.OssTypeEnum;
+import com.ard.oss.service.IOssService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
-
-import javax.annotation.PostConstruct;
import java.io.InputStream;
import java.net.URL;
-import java.util.ArrayList;
import java.util.Date;
-import java.util.List;
import java.util.Objects;
/**
@@ -73,6 +70,7 @@
client.deleteObject(bucket, objectKey);
return true;
}
+
@Override
public InputStream getObject(String bucket, String objectKey) {
return client.getObject(bucket, objectKey).getObjectContent().getDelegateStream();
@@ -99,27 +97,27 @@
.build();
}
- /**
- * Configuring cross-origin resource sharing
- */
- @PostConstruct
- private void configCORS() {
- if (!OssConfiguration.enable || !OssTypeEnum.AWS.getType().equals(OssConfiguration.provider)) {
- return;
- }
- List<CORSRule.AllowedMethods> allowedMethods = new ArrayList<>();
- allowedMethods.add(CORSRule.AllowedMethods.GET);
- allowedMethods.add(CORSRule.AllowedMethods.POST);
- allowedMethods.add(CORSRule.AllowedMethods.DELETE);
-
- CORSRule rule = new CORSRule()
- .withId("CORSAccessRule")
- .withAllowedOrigins(List.of("*"))
- .withAllowedHeaders(List.of(AuthInterceptor.PARAM_TOKEN))
- .withAllowedMethods(allowedMethods);
-
- client.setBucketCrossOriginConfiguration(OssConfiguration.bucket,
- new BucketCrossOriginConfiguration().withRules(rule));
-
- }
+// /**
+// * Configuring cross-origin resource sharing
+// */
+// @PostConstruct
+// private void configCORS() {
+// if (!OssConfiguration.enable || !OssTypeEnum.AWS.getType().equals(OssConfiguration.provider)) {
+// return;
+// }
+// List<CORSRule.AllowedMethods> allowedMethods = new ArrayList<>();
+// allowedMethods.add(CORSRule.AllowedMethods.GET);
+// allowedMethods.add(CORSRule.AllowedMethods.POST);
+// allowedMethods.add(CORSRule.AllowedMethods.DELETE);
+//
+// CORSRule rule = new CORSRule()
+// .withId("CORSAccessRule")
+// .withAllowedOrigins(List.of("*"))
+// .withAllowedHeaders(List.of(AuthInterceptor.PARAM_TOKEN))
+// .withAllowedMethods(allowedMethods);
+//
+// client.setBucketCrossOriginConfiguration(OssConfiguration.bucket,
+// new BucketCrossOriginConfiguration().withRules(rule));
+//
+// }
}
diff --git a/ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/MinIOServiceImpl.java b/ard-oss/src/main/java/com/ard/oss/service/impl/MinIOServiceImpl.java
similarity index 60%
rename from ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/MinIOServiceImpl.java
rename to ard-oss/src/main/java/com/ard/oss/service/impl/MinIOServiceImpl.java
index 901ef70..758b8b3 100644
--- a/ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/MinIOServiceImpl.java
+++ b/ard-oss/src/main/java/com/ard/oss/service/impl/MinIOServiceImpl.java
@@ -1,23 +1,32 @@
-package com.ard.sample.component.oss.service.impl;
+package com.ard.oss.service.impl;
import com.ard.common.config.OssConfiguration;
-import com.ard.sample.component.oss.model.enums.OssTypeEnum;
-import com.ard.sample.component.oss.service.IOssService;
-import com.ard.sample.media.model.CredentialsDTO;
+import com.ard.oss.model.CredentialsDTO;
+import com.ard.oss.model.enums.OssTypeEnum;
+import com.ard.oss.service.IOssService;
import io.minio.*;
import io.minio.credentials.AssumeRoleProvider;
import io.minio.errors.*;
import io.minio.http.Method;
import lombok.extern.slf4j.Slf4j;
+import okhttp3.OkHttpClient;
import org.springframework.stereotype.Service;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.security.cert.X509Certificate;
import java.util.Objects;
+
+import static com.ard.common.config.OssConfiguration.*;
/**
* @author sean
@@ -29,7 +38,7 @@
public class MinIOServiceImpl implements IOssService {
private MinioClient client;
-
+
@Override
public String getOssType() {
return OssTypeEnum.MINIO.getType();
@@ -38,8 +47,8 @@
@Override
public CredentialsDTO getCredentials() {
try {
- AssumeRoleProvider provider = new AssumeRoleProvider(OssConfiguration.endpoint, OssConfiguration.accessKey,
- OssConfiguration.secretKey, Math.toIntExact(OssConfiguration.expire),
+ AssumeRoleProvider provider = new AssumeRoleProvider(endpoint, accessKey,
+ secretKey, Math.toIntExact(OssConfiguration.expire),
null, OssConfiguration.region, null, null, null, null);
return new CredentialsDTO(provider.fetch(), OssConfiguration.expire);
} catch (NoSuchAlgorithmException e) {
@@ -54,15 +63,15 @@
try {
return new URL(
client.getPresignedObjectUrl(
- GetPresignedObjectUrlArgs.builder()
- .method(Method.GET)
- .bucket(bucket)
- .object(objectKey)
- .expiry(Math.toIntExact(OssConfiguration.expire))
- .build()));
+ GetPresignedObjectUrlArgs.builder()
+ .method(Method.GET)
+ .bucket(bucket)
+ .object(objectKey)
+ .expiry(Math.toIntExact(OssConfiguration.expire))
+ .build()));
} catch (ErrorResponseException | InsufficientDataException | InternalException |
- InvalidKeyException | InvalidResponseException | IOException |
- NoSuchAlgorithmException | XmlParserException | ServerException e) {
+ InvalidKeyException | InvalidResponseException | IOException |
+ NoSuchAlgorithmException | XmlParserException | ServerException e) {
throw new RuntimeException("The file does not exist on the OssConfiguration.");
}
}
@@ -114,10 +123,34 @@
if (Objects.nonNull(this.client)) {
return;
}
- this.client = MinioClient.builder()
- .endpoint(OssConfiguration.endpoint)
- .credentials(OssConfiguration.accessKey, OssConfiguration.secretKey)
- .region(OssConfiguration.region)
- .build();
+ try {
+ TrustManager[] trustAllCerts = new TrustManager[]{
+ new X509TrustManager() {
+ @Override
+ public void checkClientTrusted(X509Certificate[] chain, String authType) {}
+ @Override
+ public void checkServerTrusted(X509Certificate[] chain, String authType) {}
+ @Override
+ public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[]{}; }
+ }
+ };
+
+ SSLContext sslContext = SSLContext.getInstance("TLS");
+ sslContext.init(null, trustAllCerts, new SecureRandom());
+ SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();
+
+ OkHttpClient httpClient = new OkHttpClient.Builder()
+ .sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0])
+ .hostnameVerifier((hostname, session) -> true)
+ .build();
+
+ this.client = MinioClient.builder()
+ .endpoint(endpoint)
+ .credentials(accessKey, secretKey)
+ .httpClient(httpClient)
+ .build();
+ } catch (Exception e) {
+ throw new RuntimeException("Failed to create unsafe MinioClient", e);
+ }
}
}
diff --git a/ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/OssAspectHandler.java b/ard-oss/src/main/java/com/ard/oss/service/impl/OssAspectHandler.java
similarity index 83%
rename from ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/OssAspectHandler.java
rename to ard-oss/src/main/java/com/ard/oss/service/impl/OssAspectHandler.java
index 44afd4b..fe6fc37 100644
--- a/ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/OssAspectHandler.java
+++ b/ard-oss/src/main/java/com/ard/oss/service/impl/OssAspectHandler.java
@@ -1,4 +1,4 @@
-package com.ard.sample.component.oss.service.impl;
+package com.ard.oss.service.impl;
import com.ard.common.config.OssConfiguration;
import org.aspectj.lang.annotation.Aspect;
@@ -18,7 +18,7 @@
@Autowired
private OssServiceContext ossServiceContext;
- @Before("execution(public * com.ard.sample.component.oss.service.impl.OssServiceContext.*(..))")
+ @Before("execution(public * com.ard.oss.service.impl.OssServiceContext.*(..))")
public void before() {
if (!OssConfiguration.enable) {
throw new IllegalArgumentException("Please enable OssConfiguration.");
diff --git a/ard-oss/src/main/java/com/ard/oss/service/impl/OssServiceContext.java b/ard-oss/src/main/java/com/ard/oss/service/impl/OssServiceContext.java
new file mode 100644
index 0000000..c3f7a89
--- /dev/null
+++ b/ard-oss/src/main/java/com/ard/oss/service/impl/OssServiceContext.java
@@ -0,0 +1,165 @@
+package com.ard.oss.service.impl;
+
+import com.ard.common.config.OssConfiguration;
+import com.ard.common.exception.file.FileNameLengthLimitExceededException;
+import com.ard.common.exception.file.FileSizeLimitExceededException;
+import com.ard.common.exception.file.InvalidExtensionException;
+import com.ard.common.utils.file.FileUploadUtils;
+import com.ard.common.utils.file.MimeTypeUtils;
+import com.ard.oss.model.CredentialsDTO;
+import com.ard.oss.model.enums.OssTypeEnum;
+import com.ard.oss.service.IOssService;
+import io.minio.PutObjectArgs;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.List;
+
+import static com.ard.common.utils.file.FileUploadUtils.assertAllowed;
+import static com.ard.common.utils.file.FileUploadUtils.extractFilename;
+
+/**
+ * @author sean
+ * @version 1.0
+ * @date 2022/5/30
+ */
+@Service
+public class OssServiceContext {
+
+ private IOssService ossService;
+
+ @Autowired
+ public OssServiceContext(List<IOssService> ossServices, OssConfiguration configuration) {
+ if (!OssConfiguration.enable) {
+ return;
+ }
+ this.ossService = ossServices.stream()
+ .filter(ossService -> ossService.getOssType().equals(OssConfiguration.provider))
+ .findFirst()
+ .orElseThrow(() -> new IllegalArgumentException("Oss provider is illegal. Optional: " +
+ Arrays.toString(Arrays.stream(OssTypeEnum.values()).map(OssTypeEnum::getType).toArray())));
+ }
+
+ IOssService getOssService() {
+ return this.ossService;
+ }
+
+ public CredentialsDTO getCredentials() {
+ return this.ossService.getCredentials();
+ }
+
+ public URL getObjectUrl(String bucket, String objectKey) {
+ if (!StringUtils.hasText(bucket) || !StringUtils.hasText(objectKey)) {
+ throw new IllegalArgumentException();
+ }
+ return this.ossService.getObjectUrl(bucket, objectKey);
+ }
+
+ public Boolean deleteObject(String bucket, String objectKey) {
+ return this.ossService.deleteObject(bucket, objectKey);
+ }
+
+ public InputStream getObject(String bucket, String objectKey) {
+ return this.ossService.getObject(bucket, objectKey);
+ }
+
+ public void putObject(String bucket, String objectKey, InputStream stream) {
+ this.ossService.putObject(bucket, objectKey, stream);
+ }
+
+
+ void createClient() {
+ this.ossService.createClient();
+ }
+
+ /**
+ * 以默认BucketName配置上传到Minio服务器
+ *
+ * @param file 上传的文件
+ * @return 文件名称
+ * @throws Exception
+ */
+ public String upload(MultipartFile file) throws IOException {
+ try {
+ return upload(OssConfiguration.bucket, null, file);
+ } catch (Exception e) {
+ throw new IOException(e.getMessage(), e);
+ }
+ }
+
+ /**
+ * 自定义bucketName配置上传到Minio服务器
+ *
+ * @param file 上传的文件
+ * @return 文件名称
+ * @throws Exception
+ */
+ public String upload(String bucket, MultipartFile file) throws IOException {
+ try {
+ return upload(bucket, null, file);
+ } catch (Exception e) {
+ throw new IOException(e.getMessage(), e);
+ }
+ }
+
+ /**
+ * ✅ 通用上传方法:
+ * - bucket 必传
+ * - object 可选(为空则自动生成)
+ * - 返回永久访问 URL
+ */
+ public String upload(String bucket, String object, MultipartFile file) throws IOException {
+ try {
+ // 校验文件名长度
+ int fileNameLength = file.getOriginalFilename().length();
+ if (fileNameLength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) {
+ throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
+ }
+
+ // 检查文件扩展名是否合法
+ assertAllowed(file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
+
+ // ✅ 如果 object 为空,则自动生成文件名
+ String objectName = (object == null || object.isEmpty())
+ ? extractFilename(file)
+ : object;
+
+ // 上传文件到 Minio
+ this.ossService.putObject(bucket, objectName, file.getInputStream());
+
+ // ✅ 拼接永久 URL(不带 presigned 过期参数)
+ String baseUrl = OssConfiguration.endpoint;
+ if (!baseUrl.endsWith("/")) {
+ baseUrl += "/";
+ }
+
+ return baseUrl + bucket + "/" + objectName;
+ } catch (Exception e) {
+ throw new IOException("Upload failed: " + e.getMessage(), e);
+ }
+ }
+
+ public String upload(String bucket, String objectKey, InputStream input) {
+ try {
+
+ // 上传文件
+ this.ossService.putObject(bucket, objectKey, input);
+
+ // ✅ 构建永久访问 URL
+ String baseUrl = OssConfiguration.endpoint;
+ if (!baseUrl.endsWith("/")) {
+ baseUrl += "/";
+ }
+ return baseUrl + bucket + "/" + objectKey;
+ } catch (Exception e) {
+ throw new RuntimeException("Upload failed: " + e.getMessage(), e);
+ }
+ }
+
+}
diff --git a/ard-sample/pom.xml b/ard-sample/pom.xml
index 5c6abad..8a4e9f4 100644
--- a/ard-sample/pom.xml
+++ b/ard-sample/pom.xml
@@ -28,8 +28,6 @@
ard-sample机场模块
</description>
<properties>
- <aliyun-sdk-sts.version>3.1.0</aliyun-sdk-sts.version>
- <aliyun-oss.version>3.12.0</aliyun-oss.version>
<glassfish-jaxb.version>2.3.3</glassfish-jaxb.version>
<javax-jaxb.version>2.3.0</javax-jaxb.version>
</properties>
@@ -43,11 +41,6 @@
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
- </dependency>
-
- <dependency>
- <groupId>io.minio</groupId>
- <artifactId>minio</artifactId>
</dependency>
<dependency>
@@ -73,17 +66,6 @@
</dependency>
<dependency>
- <groupId>com.amazonaws</groupId>
- <artifactId>aws-java-sdk-s3</artifactId>
- <version>1.12.261</version>
- </dependency>
- <dependency>
- <groupId>com.amazonaws</groupId>
- <artifactId>aws-java-sdk-sts</artifactId>
- <version>1.12.261</version>
- </dependency>
-
- <dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
@@ -101,24 +83,11 @@
</dependency>
<dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-aop</artifactId>
- </dependency>
- <dependency>
<groupId>com.ard</groupId>
<artifactId>ard-common</artifactId>
</dependency>
- <dependency>
- <groupId>com.aliyun</groupId>
- <artifactId>aliyun-java-sdk-sts</artifactId>
- <version>${aliyun-sdk-sts.version}</version>
- </dependency>
- <dependency>
- <groupId>com.aliyun.oss</groupId>
- <artifactId>aliyun-sdk-oss</artifactId>
- <version>${aliyun-oss.version}</version>
- </dependency>
+
<!-- 核心模块-->
<dependency>
<groupId>com.ard</groupId>
@@ -139,9 +108,11 @@
<groupId>org.springframework.integration</groupId>
<artifactId>spring-integration-mqtt</artifactId>
</dependency>
+
+ <!-- storage模块-->
<dependency>
<groupId>com.ard</groupId>
- <artifactId>ard-common</artifactId>
+ <artifactId>ard-oss</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
diff --git a/ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/OssServiceContext.java b/ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/OssServiceContext.java
deleted file mode 100644
index ecc6fd6..0000000
--- a/ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/OssServiceContext.java
+++ /dev/null
@@ -1,68 +0,0 @@
-package com.ard.sample.component.oss.service.impl;
-
-import com.ard.common.config.OssConfiguration;
-import com.ard.sample.component.oss.model.enums.OssTypeEnum;
-import com.ard.sample.component.oss.service.IOssService;
-import com.ard.sample.media.model.CredentialsDTO;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.util.StringUtils;
-
-import java.io.InputStream;
-import java.net.URL;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * @author sean
- * @version 1.0
- * @date 2022/5/30
- */
-@Service
-public class OssServiceContext {
-
- private IOssService ossService;
-
- @Autowired
- public OssServiceContext(List<IOssService> ossServices, OssConfiguration configuration) {
- if (!OssConfiguration.enable) {
- return;
- }
- this.ossService = ossServices.stream()
- .filter(ossService -> ossService.getOssType().equals(OssConfiguration.provider))
- .findFirst()
- .orElseThrow(() -> new IllegalArgumentException("Oss provider is illegal. Optional: " +
- Arrays.toString(Arrays.stream(OssTypeEnum.values()).map(OssTypeEnum::getType).toArray())));
- }
-
- IOssService getOssService() {
- return this.ossService;
- }
-
- public CredentialsDTO getCredentials() {
- return this.ossService.getCredentials();
- }
-
- public URL getObjectUrl(String bucket, String objectKey) {
- if (!StringUtils.hasText(bucket) || !StringUtils.hasText(objectKey)) {
- throw new IllegalArgumentException();
- }
- return this.ossService.getObjectUrl(bucket, objectKey);
- }
-
- public Boolean deleteObject(String bucket, String objectKey) {
- return this.ossService.deleteObject(bucket, objectKey);
- }
-
- public InputStream getObject(String bucket, String objectKey) {
- return this.ossService.getObject(bucket, objectKey);
- }
-
- public void putObject(String bucket, String objectKey, InputStream stream) {
- this.ossService.putObject(bucket, objectKey, stream);
- }
-
- void createClient() {
- this.ossService.createClient();
- }
-}
diff --git a/ard-sample/src/main/java/com/ard/sample/component/websocket/config/AuthPrincipalHandler.java b/ard-sample/src/main/java/com/ard/sample/component/websocket/config/AuthPrincipalHandler.java
index b40b1ef..897fc73 100644
--- a/ard-sample/src/main/java/com/ard/sample/component/websocket/config/AuthPrincipalHandler.java
+++ b/ard-sample/src/main/java/com/ard/sample/component/websocket/config/AuthPrincipalHandler.java
@@ -1,11 +1,8 @@
package com.ard.sample.component.websocket.config;
-import com.ard.common.constant.Constants;
import com.ard.common.core.domain.model.LoginUser;
import com.ard.framework.web.service.TokenService;
import com.ard.sample.component.AuthInterceptor;
-import io.jsonwebtoken.Claims;
-import io.jsonwebtoken.Jwts;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServletServerHttpRequest;
diff --git a/ard-sample/src/main/java/com/ard/sample/manage/model/dto/LogsUploadCredentialsDTO.java b/ard-sample/src/main/java/com/ard/sample/manage/model/dto/LogsUploadCredentialsDTO.java
index a129982..75535b8 100644
--- a/ard-sample/src/main/java/com/ard/sample/manage/model/dto/LogsUploadCredentialsDTO.java
+++ b/ard-sample/src/main/java/com/ard/sample/manage/model/dto/LogsUploadCredentialsDTO.java
@@ -1,8 +1,8 @@
package com.ard.sample.manage.model.dto;
import com.ard.sample.manage.model.receiver.LogsFileUploadList;
-import com.ard.sample.media.model.CredentialsDTO;
-import com.ard.sample.media.model.StsCredentialsDTO;
+import com.ard.oss.model.CredentialsDTO;
+import com.ard.oss.model.StsCredentialsDTO;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
diff --git a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceFirmwareServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceFirmwareServiceImpl.java
index 189c3fb..4a28c37 100644
--- a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceFirmwareServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceFirmwareServiceImpl.java
@@ -1,5 +1,7 @@
package com.ard.sample.manage.service.impl;
+import com.ard.common.config.OssConfiguration;
+import com.ard.oss.service.impl.OssServiceContext;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -8,8 +10,6 @@
import com.ard.sample.common.model.ResponseResult;
import com.ard.sample.component.mqtt.model.*;
import com.ard.sample.component.mqtt.service.impl.MessageSenderServiceImpl;
-import com.ard.common.config.OssConfiguration;
-import com.ard.sample.component.oss.service.impl.OssServiceContext;
import com.ard.common.core.redis.RedisConst;
import com.ard.common.core.redis.RedisOpsUtils;
import com.ard.sample.component.websocket.config.ConcurrentWebSocketSession;
diff --git a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceLogsServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceLogsServiceImpl.java
index d36b465..d80e995 100644
--- a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceLogsServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceLogsServiceImpl.java
@@ -1,5 +1,6 @@
package com.ard.sample.manage.service.impl;
+import com.ard.sample.storage.service.IStorageService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -24,7 +25,6 @@
import com.ard.sample.manage.service.IDeviceLogsService;
import com.ard.sample.manage.service.ILogsFileService;
import com.ard.sample.manage.service.ITopologyService;
-import com.ard.sample.storage.service.IStorageService;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
diff --git a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/LogsFileServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/LogsFileServiceImpl.java
index 54afa8d..01a98f4 100644
--- a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/LogsFileServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/LogsFileServiceImpl.java
@@ -1,10 +1,10 @@
package com.ard.sample.manage.service.impl;
+import com.ard.common.config.OssConfiguration;
+import com.ard.oss.service.impl.OssServiceContext;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.ard.sample.component.mqtt.model.EventsResultStatusEnum;
-import com.ard.common.config.OssConfiguration;
-import com.ard.sample.component.oss.service.impl.OssServiceContext;
import com.ard.sample.manage.mapper.ILogsFileMapper;
import com.ard.sample.manage.model.dto.LogsFileDTO;
import com.ard.sample.manage.model.entity.LogsFileEntity;
@@ -17,7 +17,6 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
-
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
diff --git a/ard-sample/src/main/java/com/ard/sample/media/service/impl/FileServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/media/service/impl/FileServiceImpl.java
index d884feb..3e065a3 100644
--- a/ard-sample/src/main/java/com/ard/sample/media/service/impl/FileServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/media/service/impl/FileServiceImpl.java
@@ -1,11 +1,11 @@
package com.ard.sample.media.service.impl;
+import com.ard.common.config.OssConfiguration;
+import com.ard.oss.service.impl.OssServiceContext;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ard.sample.common.model.Pagination;
import com.ard.sample.common.model.PaginationData;
-import com.ard.common.config.OssConfiguration;
-import com.ard.sample.component.oss.service.impl.OssServiceContext;
import com.ard.sample.manage.model.dto.DeviceDictionaryDTO;
import com.ard.sample.manage.model.enums.DeviceDomainEnum;
import com.ard.sample.manage.service.IDeviceDictionaryService;
@@ -17,7 +17,6 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
-
import javax.annotation.Resource;
import java.net.URL;
import java.time.Instant;
diff --git a/ard-sample/src/main/java/com/ard/sample/storage/service/IStorageService.java b/ard-sample/src/main/java/com/ard/sample/storage/service/IStorageService.java
index 03b8691..aeb9cf2 100644
--- a/ard-sample/src/main/java/com/ard/sample/storage/service/IStorageService.java
+++ b/ard-sample/src/main/java/com/ard/sample/storage/service/IStorageService.java
@@ -1,7 +1,7 @@
package com.ard.sample.storage.service;
import com.ard.sample.component.mqtt.model.CommonTopicReceiver;
-import com.ard.sample.media.model.StsCredentialsDTO;
+import com.ard.oss.model.StsCredentialsDTO;
import org.springframework.messaging.MessageHeaders;
/**
diff --git a/ard-sample/src/main/java/com/ard/sample/storage/service/impl/StorageServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/storage/service/impl/StorageServiceImpl.java
index 3054078..3d02b52 100644
--- a/ard-sample/src/main/java/com/ard/sample/storage/service/impl/StorageServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/storage/service/impl/StorageServiceImpl.java
@@ -1,11 +1,11 @@
package com.ard.sample.storage.service.impl;
+import com.ard.common.config.OssConfiguration;
import com.ard.sample.component.mqtt.model.*;
import com.ard.sample.component.mqtt.service.IMessageSenderService;
-import com.ard.common.config.OssConfiguration;
-import com.ard.sample.component.oss.service.impl.OssServiceContext;
-import com.ard.sample.media.model.StsCredentialsDTO;
+import com.ard.oss.model.StsCredentialsDTO;
import com.ard.sample.storage.service.IStorageService;
+import com.ard.oss.service.impl.OssServiceContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.mqtt.support.MqttHeaders;
diff --git a/ard-sample/src/main/java/com/ard/sample/wayline/service/impl/WaylineFileServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/wayline/service/impl/WaylineFileServiceImpl.java
index aa753df..f8f6dbd 100644
--- a/ard-sample/src/main/java/com/ard/sample/wayline/service/impl/WaylineFileServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/wayline/service/impl/WaylineFileServiceImpl.java
@@ -1,5 +1,7 @@
package com.ard.sample.wayline.service.impl;
+import com.ard.common.config.OssConfiguration;
+import com.ard.oss.service.impl.OssServiceContext;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -7,8 +9,6 @@
import com.ard.common.core.page.TableSupport;
import com.ard.sample.common.model.Pagination;
import com.ard.sample.common.model.PaginationData;
-import com.ard.common.config.OssConfiguration;
-import com.ard.sample.component.oss.service.impl.OssServiceContext;
import com.ard.sample.manage.model.enums.DeviceDomainEnum;
import com.ard.sample.wayline.mapper.IWaylineFileMapper;
import com.ard.sample.wayline.model.dto.KmzFileProperties;
diff --git a/ard-work/pom.xml b/ard-work/pom.xml
index 0a3c6c7..2556421 100644
--- a/ard-work/pom.xml
+++ b/ard-work/pom.xml
@@ -106,6 +106,10 @@
<groupId>com.ard</groupId>
<artifactId>ard-system</artifactId>
</dependency>
+ <dependency>
+ <groupId>com.ard</groupId>
+ <artifactId>ard-oss</artifactId>
+ </dependency>
</dependencies>
<repositories>
<repository>
diff --git a/ard-work/src/main/java/com/ard/work/service/impl/KmzFileServiceImpl.java b/ard-work/src/main/java/com/ard/work/service/impl/KmzFileServiceImpl.java
index b56251f..05d88b6 100644
--- a/ard-work/src/main/java/com/ard/work/service/impl/KmzFileServiceImpl.java
+++ b/ard-work/src/main/java/com/ard/work/service/impl/KmzFileServiceImpl.java
@@ -1,7 +1,7 @@
package com.ard.work.service.impl;
import com.ard.common.config.OssConfiguration;
-import com.ard.common.utils.file.MinioUtil;
+import com.ard.oss.service.impl.OssServiceContext;
import com.ard.work.config.WaylinePlaningConfig;
import com.ard.work.domain.dto.wayline.*;
import com.ard.work.domain.entity.UavWayline;
@@ -43,6 +43,9 @@
@Resource
private UavWaylineMapper uavWaylineMapper;
+
+ @Resource
+ private OssServiceContext ossService;
private Document initWayline(Boolean isTemplate) {
//创建Document对象
@@ -426,11 +429,7 @@
InputStream inputStream = new FileInputStream(kmzPath);
//构建记录
String objectKey = fileName;
- //若已经存在,则先删除,再添加
- if (MinioUtil.exists(OssConfiguration.bucket, objectKey))
- MinioUtil.delete(OssConfiguration.bucket, objectKey);
- String kmzUrl = MinioUtil.uploadInputStream(OssConfiguration.bucket, objectKey, inputStream,
- inputStream.available(), "application/octet-stream");
+ String kmzUrl = ossService.upload(OssConfiguration.bucket, objectKey, inputStream);
// 更新航线kmz地址
UavWayline uavWayline = UavWayline.builder()
.id(ardWaylineDTO.waylineId)
diff --git a/pom.xml b/pom.xml
index 270faf9..1acab07 100644
--- a/pom.xml
+++ b/pom.xml
@@ -210,6 +210,15 @@
<artifactId>ard-device</artifactId>
<version>${ard.version}</version>
</dependency>
+
+ <!-- 存储模块-->
+ <dependency>
+ <groupId>com.ard</groupId>
+ <artifactId>ard-oss</artifactId>
+ <version>${ard.version}</version>
+ </dependency>
+
+
<!-- okhttp3-->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
@@ -252,6 +261,7 @@
<module>ard-vtdu</module>
<module>ard-route</module>
<module>ard-device</module>
+ <module>ard-oss</module>
</modules>
<build>
--
Gitblit v1.9.3