liusuyi
2025-10-13 bc7678e6d564b9696fbd1eddebf1584522ad7440
minio集成到公共模块
2 files added
20 files modified
3 files deleted
1 files renamed
685 ■■■■■ changed files
ard-admin/src/main/java/com/ard/web/controller/common/CommonController.java 58 ●●●●● patch | view | raw | blame | history
ard-admin/src/main/java/com/ard/web/controller/data/MinioFileController.java 47 ●●●●● patch | view | raw | blame | history
ard-admin/src/main/java/com/ard/web/core/config/SwaggerConfig.java 20 ●●●●● patch | view | raw | blame | history
ard-admin/src/main/resources/application-prod.yml 11 ●●●●● patch | view | raw | blame | history
ard-admin/src/main/resources/application.yml 5 ●●●●● patch | view | raw | blame | history
ard-common/pom.xml 11 ●●●●● 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/core/domain/entity/MinioUploadResult.java 28 ●●●●● patch | view | raw | blame | history
ard-common/src/main/java/com/ard/common/utils/file/FileUploadUtils.java 180 ●●●●● patch | view | raw | blame | history
ard-common/src/main/java/com/ard/common/utils/file/MimeTypeUtils.java 4 ●●●●● patch | view | raw | blame | history
ard-common/src/main/java/com/ard/common/utils/file/MinioUtil.java 15 ●●●●● patch | view | raw | blame | history
ard-sample/src/main/java/com/ard/sample/component/oss/model/OssConfiguration.java 92 ●●●●● patch | view | raw | blame | history
ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/AliyunOssServiceImpl.java 2 ●●●●● patch | view | raw | blame | history
ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/AmazonS3ServiceImpl.java 2 ●●●●● patch | view | raw | blame | history
ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/MinIOServiceImpl.java 2 ●●●●● patch | view | raw | blame | history
ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/OssAspectHandler.java 2 ●●●●● patch | view | raw | blame | history
ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/OssServiceContext.java 2 ●●●●● patch | view | raw | blame | history
ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceFirmwareServiceImpl.java 2 ●●●●● patch | view | raw | blame | history
ard-sample/src/main/java/com/ard/sample/manage/service/impl/LogsFileServiceImpl.java 2 ●●●●● patch | view | raw | blame | history
ard-sample/src/main/java/com/ard/sample/media/service/impl/FileServiceImpl.java 2 ●●●●● patch | view | raw | blame | history
ard-sample/src/main/java/com/ard/sample/storage/service/impl/StorageServiceImpl.java 2 ●●●●● patch | view | raw | blame | history
ard-sample/src/main/java/com/ard/sample/wayline/service/impl/WaylineFileServiceImpl.java 2 ●●●●● patch | view | raw | blame | history
ard-work/pom.xml 6 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/component/minio/config/MinioConfig.java 44 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/component/netty/handler/ClientHandler.java 2 ●●●●● patch | view | raw | blame | history
ard-work/src/main/java/com/ard/work/service/impl/KmzFileServiceImpl.java 13 ●●●●● patch | view | raw | blame | history
ard-admin/src/main/java/com/ard/web/controller/common/CommonController.java
@@ -4,14 +4,16 @@
import java.util.List;
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;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import com.ard.common.config.UavConfig;
import com.ard.common.constant.Constants;
@@ -21,11 +23,14 @@
import com.ard.common.utils.file.FileUtils;
import com.ard.framework.config.ServerConfig;
import static com.ard.common.utils.file.MinioUtil.uploadFile;
/**
 * 通用请求处理
 * 
 * @author ruoyi
 */
@Api(tags = "通用请求处理")
@RestController
@RequestMapping("/common")
public class CommonController
@@ -160,4 +165,49 @@
            log.error("下载文件失败", e);
        }
    }
    /**
     * 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/data/MinioFileController.java
File was deleted
ard-admin/src/main/java/com/ard/web/core/config/SwaggerConfig.java
@@ -148,7 +148,25 @@
                .securitySchemes(securitySchemes())
                .securityContexts(securityContexts());
    }
    @Bean
    public Docket commonApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .enable(true)
                .groupName("公共请求接口")   // 分组名
                .apiInfo(apiInfo("公共请求管理接口"))
                .select()
                // 扫描指定包下,但只扫描加了 @ApiOperation 注解的方法
                .apis(requestHandler ->
                        requestHandler.declaringClass().getPackage().getName().startsWith("com.ard.web.controller" +
                                ".common") &&
                                requestHandler.isAnnotatedWith(io.swagger.annotations.ApiOperation.class)
                )
                .paths(PathSelectors.any())
                .build()
                /* 设置安全模式,swagger可以设置访问token */
                .securitySchemes(securitySchemes())
                .securityContexts(securityContexts());
    }
    /**
     * 安全模式,这里指定token通过Authorization头请求头传递
     */
ard-admin/src/main/resources/application-prod.yml
@@ -2,10 +2,12 @@
server:
  # 服务器的HTTP端口,默认为8080
  port: 8080
# token配置
token:
  # 是否允许账户多终端同时登录(true允许 false不允许)
  soloLogin: true
# 日志配置
logging:
  level:
@@ -23,14 +25,6 @@
    enable: false
    username: admin
    password: ardkj12345
# MyBatis Plus配置
mybatis-plus:
  # 搜索指定包别名
  typeAliasesPackage: com.ard.**.domain
  # 配置mapper的扫描,找到所有的mapper.xml映射文件
  mapperLocations: classpath*:mapper/**/*Mapper.xml
  # 加载全局的配置文件
  configLocation: classpath:mybatis/mybatis-config.xml
# 地图资源配置
geoserver:
@@ -64,6 +58,7 @@
    license: khjd7FzUTzJgaArNv97XdA2nKQtYfESOvBHLqjC6MpvPqxCfuQ82nOlTgzoiLp7UoZujARopN2A1ctPFaJ8oHiHQrn3IRV4wqN3hdSM40xXj02YVvTWQBT54WS8Ks+E8Zatp3gk2T0+7cM5a5a3mWzxLMv7CNqw2z9pFBoOBdpY=
    host: 192.168.1.15
    port: 123
#流媒体
mediamtx:
  apiHost: 192.168.1.3
ard-admin/src/main/resources/application.yml
@@ -6,8 +6,8 @@
  version: 3.8.8
  # 版权年份
  copyrightYear: 2024
  # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
  profile: D:/ruoyi/uploadPath
  # 文件路径 示例( Windows配置D:/ard/uploadPath,Linux配置 /home/ard/uploadPath)
  profile: /home/ard/uploadPath
  # 获取ip地址开关
  addressEnabled: false
  # 验证码类型 math 数字计算 char 字符验证
@@ -148,7 +148,6 @@
        max-active: 8
        # #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms
  #健康监控
  boot:
    admin:
ard-common/pom.xml
@@ -125,6 +125,17 @@
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
        <!-- Minio 文件存储 -->
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>
ard-common/src/main/java/com/ard/common/config/OssConfiguration.java
New file
@@ -0,0 +1,129 @@
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();
    }
}
ard-common/src/main/java/com/ard/common/core/domain/entity/MinioUploadResult.java
New file
@@ -0,0 +1,28 @@
package com.ard.common.core.domain.entity;
import com.ard.common.annotation.DataScope;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
 * Description: Minio上传结果
 * Author: lsy
 * Date: 2025年10月13日10:42
 **/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class MinioUploadResult {
    /** 新文件名(上传后保存名) */
    private String newFileName;
    /** 文件完整访问 URL */
    private String url;
    /** 上传前原始文件名 */
    private String originalFilename;
}
ard-common/src/main/java/com/ard/common/utils/file/FileUploadUtils.java
@@ -4,8 +4,8 @@
import java.io.IOException;
import java.nio.file.Paths;
import java.util.Objects;
import org.apache.commons.io.FilenameUtils;
import org.springframework.web.multipart.MultipartFile;
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;
@@ -14,18 +14,19 @@
import com.ard.common.utils.DateUtils;
import com.ard.common.utils.StringUtils;
import com.ard.common.utils.uuid.Seq;
import org.apache.commons.io.FilenameUtils;
import org.springframework.web.multipart.MultipartFile;
/**
 * 文件上传工具类
 *
 * @author ruoyi
 */
public class FileUploadUtils
{
public class FileUploadUtils {
    /**
     * 默认大小 50M
     */
    public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024L;
    public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024;
    /**
     * 默认的文件名最大长度 100
@@ -33,18 +34,25 @@
    public static final int DEFAULT_FILE_NAME_LENGTH = 100;
    /**
     * 默认上传的地址
     * 本地默认上传的地址
     */
    private static String defaultBaseDir = UavConfig.getProfile();
    public static void setDefaultBaseDir(String defaultBaseDir)
    {
    /**
     * Minio默认上传的地址
     */
    private static String bucketName = OssConfiguration.bucket;
    public static void setDefaultBaseDir(String defaultBaseDir) {
        FileUploadUtils.defaultBaseDir = defaultBaseDir;
    }
    public static String getDefaultBaseDir()
    {
    public static String getDefaultBaseDir() {
        return defaultBaseDir;
    }
    public static String getBucketName() {
        return bucketName;
    }
    /**
@@ -54,14 +62,10 @@
     * @return 文件名称
     * @throws Exception
     */
    public static final String upload(MultipartFile file) throws IOException
    {
        try
        {
    public static final String upload(MultipartFile file) throws IOException {
        try {
            return upload(getDefaultBaseDir(), file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
        }
        catch (Exception e)
        {
        } catch (Exception e) {
            throw new IOException(e.getMessage(), e);
        }
    }
@@ -70,18 +74,14 @@
     * 根据文件路径上传
     *
     * @param baseDir 相对应用的基目录
     * @param file 上传的文件
     * @param file    上传的文件
     * @return 文件名称
     * @throws IOException
     */
    public static final String upload(String baseDir, MultipartFile file) throws IOException
    {
        try
        {
    public static final String upload(String baseDir, MultipartFile file) throws IOException {
        try {
            return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
        }
        catch (Exception e)
        {
        } catch (Exception e) {
            throw new IOException(e.getMessage(), e);
        }
    }
@@ -89,22 +89,20 @@
    /**
     * 文件上传
     *
     * @param baseDir 相对应用的基目录
     * @param file 上传的文件
     * @param baseDir          相对应用的基目录
     * @param file             上传的文件
     * @param allowedExtension 上传文件类型
     * @return 返回上传成功的文件名
     * @throws FileSizeLimitExceededException 如果超出最大大小
     * @throws FileSizeLimitExceededException       如果超出最大大小
     * @throws FileNameLengthLimitExceededException 文件名太长
     * @throws IOException 比如读写文件出错时
     * @throws InvalidExtensionException 文件校验异常
     * @throws IOException                          比如读写文件出错时
     * @throws InvalidExtensionException            文件校验异常
     */
    public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension)
            throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
            InvalidExtensionException
    {
            InvalidExtensionException {
        int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length();
        if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
        {
        if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) {
            throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
        }
@@ -118,30 +116,73 @@
    }
    /**
     * 编码文件名
     * 以默认BucketName配置上传到Minio服务器
     *
     * @param file 上传的文件
     * @return 文件名称
     * @throws Exception
     */
    public static final String extractFilename(MultipartFile file)
    {
        return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(),
                FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), getExtension(file));
    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);
        }
    }
    public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException
    {
    /**
     * 自定义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);
        }
    }
    /**
     * 编码文件名
     */
    public static final String extractFilename(MultipartFile file) {
        return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(),
                FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType),
                getExtension(file));
    }
    public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException {
        File desc = new File(uploadDir + File.separator + fileName);
        if (!desc.exists())
        {
            if (!desc.getParentFile().exists())
            {
        if (!desc.exists()) {
            if (!desc.getParentFile().exists()) {
                desc.getParentFile().mkdirs();
            }
        }
        return desc;
    }
    public static final String getPathFileName(String uploadDir, String fileName) throws IOException
    {
    public static final String getPathFileName(String uploadDir, String fileName) throws IOException {
        int dirLastIndex = UavConfig.getProfile().length() + 1;
        String currentDir = StringUtils.substring(uploadDir, dirLastIndex);
        return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName;
@@ -156,40 +197,28 @@
     * @throws InvalidExtensionException
     */
    public static final void assertAllowed(MultipartFile file, String[] allowedExtension)
            throws FileSizeLimitExceededException, InvalidExtensionException
    {
            throws FileSizeLimitExceededException, InvalidExtensionException {
        long size = file.getSize();
        if (size > DEFAULT_MAX_SIZE)
        {
        if (size > DEFAULT_MAX_SIZE) {
            throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024);
        }
        String fileName = file.getOriginalFilename();
        String extension = getExtension(file);
        if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension))
        {
            if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION)
            {
        if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) {
            if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION) {
                throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension,
                        fileName);
            }
            else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION)
            {
            } else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION) {
                throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension,
                        fileName);
            }
            else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION)
            {
            } else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION) {
                throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension,
                        fileName);
            }
            else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION)
            {
            } else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION) {
                throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension,
                        fileName);
            }
            else
            {
            } else {
                throw new InvalidExtensionException(allowedExtension, extension, fileName);
            }
        }
@@ -202,12 +231,9 @@
     * @param allowedExtension
     * @return
     */
    public static final boolean isAllowedExtension(String extension, String[] allowedExtension)
    {
        for (String str : allowedExtension)
        {
            if (str.equalsIgnoreCase(extension))
            {
    public static final boolean isAllowedExtension(String extension, String[] allowedExtension) {
        for (String str : allowedExtension) {
            if (str.equalsIgnoreCase(extension)) {
                return true;
            }
        }
@@ -220,13 +246,11 @@
     * @param file 表单文件
     * @return 后缀名
     */
    public static final String getExtension(MultipartFile file)
    {
    public static final String getExtension(MultipartFile file) {
        String extension = FilenameUtils.getExtension(file.getOriginalFilename());
        if (StringUtils.isEmpty(extension))
        {
        if (StringUtils.isEmpty(extension)) {
            extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType()));
        }
        return extension;
    }
}
}
ard-common/src/main/java/com/ard/common/utils/file/MimeTypeUtils.java
@@ -36,7 +36,9 @@
            // 视频格式
            "mp4", "avi", "rmvb",
            // pdf
            "pdf" };
            "pdf",
            // kmz
            "kmz"};
    public static String getExtension(String prefix)
    {
ard-common/src/main/java/com/ard/common/utils/file/MinioUtil.java
File was renamed from ard-work/src/main/java/com/ard/work/component/minio/utils/MinioUtil.java
@@ -1,22 +1,26 @@
package com.ard.work.component.minio.utils;
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.*;
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 {
public class MinioUtil
{
    /**
     * 判断桶是否存在
     *
@@ -214,5 +218,4 @@
            throw new IOException(e.getMessage(), e);
        }
    }
}
ard-sample/src/main/java/com/ard/sample/component/oss/model/OssConfiguration.java
File was deleted
ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/AliyunOssServiceImpl.java
@@ -12,7 +12,7 @@
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.sts.model.v20150401.AssumeRoleRequest;
import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse;
import com.ard.sample.component.oss.model.OssConfiguration;
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;
ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/AmazonS3ServiceImpl.java
@@ -12,7 +12,7 @@
import com.amazonaws.services.securitytoken.model.AssumeRoleResult;
import com.amazonaws.services.securitytoken.model.Credentials;
import com.ard.sample.component.AuthInterceptor;
import com.ard.sample.component.oss.model.OssConfiguration;
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;
ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/MinIOServiceImpl.java
@@ -1,6 +1,6 @@
package com.ard.sample.component.oss.service.impl;
import com.ard.sample.component.oss.model.OssConfiguration;
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;
ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/OssAspectHandler.java
@@ -1,6 +1,6 @@
package com.ard.sample.component.oss.service.impl;
import com.ard.sample.component.oss.model.OssConfiguration;
import com.ard.common.config.OssConfiguration;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
ard-sample/src/main/java/com/ard/sample/component/oss/service/impl/OssServiceContext.java
@@ -1,6 +1,6 @@
package com.ard.sample.component.oss.service.impl;
import com.ard.sample.component.oss.model.OssConfiguration;
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;
ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceFirmwareServiceImpl.java
@@ -8,7 +8,7 @@
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.sample.component.oss.model.OssConfiguration;
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;
ard-sample/src/main/java/com/ard/sample/manage/service/impl/LogsFileServiceImpl.java
@@ -3,7 +3,7 @@
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.sample.component.oss.model.OssConfiguration;
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;
ard-sample/src/main/java/com/ard/sample/media/service/impl/FileServiceImpl.java
@@ -4,7 +4,7 @@
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.sample.component.oss.model.OssConfiguration;
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;
ard-sample/src/main/java/com/ard/sample/storage/service/impl/StorageServiceImpl.java
@@ -2,7 +2,7 @@
import com.ard.sample.component.mqtt.model.*;
import com.ard.sample.component.mqtt.service.IMessageSenderService;
import com.ard.sample.component.oss.model.OssConfiguration;
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.sample.storage.service.IStorageService;
ard-sample/src/main/java/com/ard/sample/wayline/service/impl/WaylineFileServiceImpl.java
@@ -7,7 +7,7 @@
import com.ard.common.core.page.TableSupport;
import com.ard.sample.common.model.Pagination;
import com.ard.sample.common.model.PaginationData;
import com.ard.sample.component.oss.model.OssConfiguration;
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;
ard-work/pom.xml
@@ -86,11 +86,7 @@
            <artifactId>gt-epsg-hsql</artifactId>
            <version>28.2</version>
        </dependency>
        <!--minio-->
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
        </dependency>
        <!--DOM4j-->
        <dependency>
            <groupId>org.dom4j</groupId>
ard-work/src/main/java/com/ard/work/component/minio/config/MinioConfig.java
File was deleted
ard-work/src/main/java/com/ard/work/component/netty/handler/ClientHandler.java
@@ -47,7 +47,7 @@
        String host = remoteAddress.getHostString();
        int port = remoteAddress.getPort();
        log.info("与天宇服务器 [{}] 连接成功 ({}:{})", serverId, host, port);
        log.info("与边缘服务器 [{}] 连接成功 ({}:{})", serverId, host, port);
        // 针对当前连接的服务器进行注册
        tyService.registerMessage(serverId);
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.work.component.minio.config.MinioConfig;
import com.ard.work.component.minio.utils.MinioUtil;
import com.ard.common.config.OssConfiguration;
import com.ard.common.utils.file.MinioUtil;
import com.ard.work.config.WaylinePlaningConfig;
import com.ard.work.domain.dto.wayline.*;
import com.ard.work.domain.entity.UavWayline;
@@ -34,9 +34,6 @@
@Slf4j
@Transactional
public class KmzFileServiceImpl implements IKmzFileService {
    @Resource
    private MinioConfig minioConfig;
    @Resource
    private IGeoToolsService geoToolsService;
@@ -430,9 +427,9 @@
                //构建记录
                String objectKey = fileName;
                //若已经存在,则先删除,再添加
                if (MinioUtil.exists(minioConfig.getBucketName(), objectKey))
                    MinioUtil.delete(minioConfig.getBucketName(), objectKey);
                String kmzUrl = MinioUtil.uploadInputStream(minioConfig.getBucketName(), objectKey, inputStream,
                if (MinioUtil.exists(OssConfiguration.bucket, objectKey))
                    MinioUtil.delete(OssConfiguration.bucket, objectKey);
                String kmzUrl = MinioUtil.uploadInputStream(OssConfiguration.bucket, objectKey, inputStream,
                        inputStream.available(), "application/octet-stream");
                // 更新航线kmz地址
                UavWayline uavWayline =  UavWayline.builder()