liusuyi
2025-10-13 b9461fd1ec44382c27ea35c66970d5ba14b64056
增加存储模块
4 files added
16 files modified
4 files deleted
9 files renamed
1224 ■■■■■ changed files
ard-admin/src/main/java/com/ard/web/controller/common/CommonController.java 48 ●●●●● patch | view | raw | blame | history
ard-admin/src/main/java/com/ard/web/controller/sample/storage/StorageController.java 36 ●●●●● patch | view | raw | blame | history
ard-admin/src/main/java/com/ard/web/controller/storage/FileUploadController.java 69 ●●●●● patch | view | raw | blame | history
ard-admin/src/main/java/com/ard/web/core/config/SwaggerConfig.java 8 ●●●●● patch | view | raw | blame | history
ard-common/src/main/java/com/ard/common/config/OssConfiguration.java 129 ●●●●● patch | view | raw | blame | history
ard-common/src/main/java/com/ard/common/utils/file/FileUploadUtils.java 54 ●●●●● patch | view | raw | blame | history
ard-common/src/main/java/com/ard/common/utils/file/MinioUtil.java 221 ●●●●● patch | view | raw | blame | history
ard-oss/pom.xml 70 ●●●●● patch | view | raw | blame | history
ard-oss/src/main/java/com/ard/oss/config/OssConfiguration.java 94 ●●●●● patch | view | raw | blame | history
ard-oss/src/main/java/com/ard/oss/model/CredentialsDTO.java 2 ●●●●● patch | view | raw | blame | history
ard-oss/src/main/java/com/ard/oss/model/MinioUploadResult.java 3 ●●●●● patch | view | raw | blame | history
ard-oss/src/main/java/com/ard/oss/model/StsCredentialsDTO.java 2 ●●●●● patch | view | raw | blame | history
ard-oss/src/main/java/com/ard/oss/model/enums/OssTypeEnum.java 2 ●●●●● patch | view | raw | blame | history
ard-oss/src/main/java/com/ard/oss/service/IOssService.java 6 ●●●●● patch | view | raw | blame | history
ard-oss/src/main/java/com/ard/oss/service/impl/AliyunOssServiceImpl.java 9 ●●●●● patch | view | raw | blame | history
ard-oss/src/main/java/com/ard/oss/service/impl/AmazonS3ServiceImpl.java 64 ●●●●● patch | view | raw | blame | history
ard-oss/src/main/java/com/ard/oss/service/impl/MinIOServiceImpl.java 73 ●●●●● patch | view | raw | blame | history
ard-oss/src/main/java/com/ard/oss/service/impl/OssAspectHandler.java 4 ●●●●● patch | view | raw | blame | history
ard-oss/src/main/java/com/ard/oss/service/impl/OssServiceContext.java 165 ●●●●● patch | view | raw | blame | history
ard-sample/pom.xml 37 ●●●●● patch | view | raw | blame | history
ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/OssServiceContext.java 68 ●●●●● patch | view | raw | blame | history
ard-sample/src/main/java/com/ard/sample/component/websocket/config/AuthPrincipalHandler.java 3 ●●●●● patch | view | raw | blame | history
ard-sample/src/main/java/com/ard/sample/manage/model/dto/LogsUploadCredentialsDTO.java 4 ●●●●● patch | view | raw | blame | history
ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceFirmwareServiceImpl.java 4 ●●●●● patch | view | raw | blame | history
ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceLogsServiceImpl.java 2 ●●●●● patch | view | raw | blame | history
ard-sample/src/main/java/com/ard/sample/manage/service/impl/LogsFileServiceImpl.java 5 ●●●●● patch | view | raw | blame | history
ard-sample/src/main/java/com/ard/sample/media/service/impl/FileServiceImpl.java 5 ●●●●● patch | view | raw | blame | history
ard-sample/src/main/java/com/ard/sample/storage/service/IStorageService.java 2 ●●●●● patch | view | raw | blame | history
ard-sample/src/main/java/com/ard/sample/storage/service/impl/StorageServiceImpl.java 6 ●●●●● patch | view | raw | blame | history
ard-sample/src/main/java/com/ard/sample/wayline/service/impl/WaylineFileServiceImpl.java 4 ●●●●● patch | view | raw | blame | history
ard-work/pom.xml 4 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/service/impl/KmzFileServiceImpl.java 11 ●●●●● patch | view | raw | blame | history
pom.xml 10 ●●●●● patch | view | raw | blame | history
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>