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()); } } } ard-admin/src/main/java/com/ard/web/controller/sample/storage/StorageController.java
File was deleted ard-admin/src/main/java/com/ard/web/controller/storage/FileUploadController.java
New file @@ -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()); } } } 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()) ard-common/src/main/java/com/ard/common/config/OssConfiguration.java
File was deleted 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); } } /** * 编码文件名 ard-common/src/main/java/com/ard/common/utils/file/MinioUtil.java
File was deleted ard-oss/pom.xml
New file @@ -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> ard-oss/src/main/java/com/ard/oss/config/OssConfiguration.java
New file @@ -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; } } ard-oss/src/main/java/com/ard/oss/model/CredentialsDTO.java
File was renamed from ard-sample/src/main/java/com/ard/sample/media/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; ard-oss/src/main/java/com/ard/oss/model/MinioUploadResult.java
File was renamed from ard-common/src/main/java/com/ard/common/core/domain/entity/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; ard-oss/src/main/java/com/ard/oss/model/StsCredentialsDTO.java
File was renamed from ard-sample/src/main/java/com/ard/sample/media/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; ard-oss/src/main/java/com/ard/oss/model/enums/OssTypeEnum.java
File was renamed from ard-sample/src/main/java/com/ard/sample/component/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 ard-oss/src/main/java/com/ard/oss/service/IOssService.java
File was renamed from ard-sample/src/main/java/com/ard/sample/component/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(); } ard-oss/src/main/java/com/ard/oss/service/impl/AliyunOssServiceImpl.java
File was renamed from ard-sample/src/main/java/com/ard/sample/component/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); } } ard-oss/src/main/java/com/ard/oss/service/impl/AmazonS3ServiceImpl.java
File was renamed from ard-sample/src/main/java/com/ard/sample/component/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)); // // } } ard-oss/src/main/java/com/ard/oss/service/impl/MinIOServiceImpl.java
File was renamed from ard-sample/src/main/java/com/ard/sample/component/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); } } } ard-oss/src/main/java/com/ard/oss/service/impl/OssAspectHandler.java
File was renamed from ard-sample/src/main/java/com/ard/sample/component/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."); ard-oss/src/main/java/com/ard/oss/service/impl/OssServiceContext.java
New file @@ -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); } } } 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> ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/OssServiceContext.java
File was deleted 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; 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; 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; 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; 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; 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; 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; /** 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; 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; 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> 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) 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>