1
13693261870
2024-11-20 ab02e6e14c1b31f3477c434f31213685246603f5
1
已添加9个文件
已修改1个文件
581 ■■■■■ 文件已修改
se-modules/se-system/pom.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/config/MinioConfig.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/config/ResourcesConfig.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/controller/SysFileController.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/service/impl/FastDfsSysFileServiceImpl.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/service/impl/LocalSysFileServiceImpl.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/service/impl/MinioSysFileServiceImpl.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/service/inte/ISysFileService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/src/main/java/com/se/system/utils/FileUploadUtils.java 186 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
说明.txt 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-modules/se-system/pom.xml
@@ -85,6 +85,26 @@
            <version>1.18.22</version>
            <optional>true</optional>
        </dependency>
        <!-- FastDFS -->
        <dependency>
            <groupId>com.github.tobato</groupId>
            <artifactId>fastdfs-client</artifactId>
        </dependency>
        <!-- Minio -->
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>8.2.2</version>
            <!--            <version>${minio.version}</version>-->
        </dependency>
        <!-- SE Api System -->
        <dependency>
            <groupId>com.se</groupId>
            <artifactId>se-api-system</artifactId>
        </dependency>
    </dependencies>
    <build>
se-modules/se-system/src/main/java/com/se/system/config/MinioConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,82 @@
package com.se.system.config;
import io.minio.MinioClient;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * Minio é…ç½®ä¿¡æ¯
 *
 * @author admin
 */
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig
{
    /**
     * æœåŠ¡åœ°å€
     */
    private String url;
    /**
     * ç”¨æˆ·å
     */
    private String accessKey;
    /**
     * å¯†ç 
     */
    private String secretKey;
    /**
     * å­˜å‚¨æ¡¶åç§°
     */
    private String bucketName;
    public String getUrl()
    {
        return url;
    }
    public void setUrl(String url)
    {
        this.url = url;
    }
    public String getAccessKey()
    {
        return accessKey;
    }
    public void setAccessKey(String accessKey)
    {
        this.accessKey = accessKey;
    }
    public String getSecretKey()
    {
        return secretKey;
    }
    public void setSecretKey(String secretKey)
    {
        this.secretKey = secretKey;
    }
    public String getBucketName()
    {
        return bucketName;
    }
    public void setBucketName(String bucketName)
    {
        this.bucketName = bucketName;
    }
    @Bean
    public MinioClient getMinioClient()
    {
        return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();
    }
}
se-modules/se-system/src/main/java/com/se/system/config/ResourcesConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package com.se.system.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.io.File;
/**
 * é€šç”¨æ˜ å°„配置
 *
 * @author admin
 */
@Configuration
public class ResourcesConfig implements WebMvcConfigurer
{
    /**
     * ä¸Šä¼ æ–‡ä»¶å­˜å‚¨åœ¨æœ¬åœ°çš„æ ¹è·¯å¾„
     */
    @Value("${file.path}")
    private String localFilePath;
    /**
     * èµ„源映射路径 å‰ç¼€
     */
    @Value("${file.prefix}")
    public String localFilePrefix;
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry)
    {
        /** æœ¬åœ°æ–‡ä»¶ä¸Šä¼ è·¯å¾„ */
        registry.addResourceHandler(localFilePrefix + "/**")
                .addResourceLocations("file:" + localFilePath + File.separator);
    }
    /**
     * å¼€å¯è·¨åŸŸ
     */
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        // è®¾ç½®å…è®¸è·¨åŸŸçš„路由
        registry.addMapping(localFilePrefix  + "/**")
                // è®¾ç½®å…è®¸è·¨åŸŸè¯·æ±‚的域名
                .allowedOrigins("*")
                // è®¾ç½®å…è®¸çš„æ–¹æ³•
                .allowedMethods("GET");
    }
}
se-modules/se-system/src/main/java/com/se/system/controller/SysFileController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,49 @@
package com.se.system.controller;
import com.se.common.core.domain.R;
import com.se.common.core.utils.file.FileUtils;
import com.se.system.api.domain.SysFile;
import com.se.system.service.inte.ISysFileService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
/**
 * æ–‡ä»¶è¯·æ±‚处理
 *
 * @author admin
 */
@RestController
public class SysFileController
{
    private static final Logger log = LoggerFactory.getLogger(SysFileController.class);
    @Resource
    private ISysFileService sysFileService;
    /**
     * æ–‡ä»¶ä¸Šä¼ è¯·æ±‚
     */
    @PostMapping("upload")
    public R<SysFile> upload(MultipartFile file)
    {
        try
        {
            // ä¸Šä¼ å¹¶è¿”回访问地址
            String url = sysFileService.uploadFile(file);
            SysFile sysFile = new SysFile();
            sysFile.setName(FileUtils.getName(url));
            sysFile.setUrl(url);
            return R.ok(sysFile);
        }
        catch (Exception e)
        {
            log.error("上传文件失败", e);
            return R.fail(e.getMessage());
        }
    }
}
se-modules/se-system/src/main/java/com/se/system/service/impl/FastDfsSysFileServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.se.system.service.impl;
import com.alibaba.nacos.common.utils.IoUtils;
import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import com.se.common.core.utils.file.FileTypeUtils;
import com.se.system.service.inte.ISysFileService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.InputStream;
/**
 * FastDFS æ–‡ä»¶å­˜å‚¨
 *
 * @author admin
 */
@Service
public class FastDfsSysFileServiceImpl implements ISysFileService
{
    /**
     * åŸŸåæˆ–本机访问地址
     */
    @Value("${fdfs.domain}")
    public String domain;
    @Resource
    private FastFileStorageClient storageClient;
    /**
     * FastDfs文件上传接口
     *
     * @param file ä¸Šä¼ çš„æ–‡ä»¶
     * @return è®¿é—®åœ°å€
     * @throws Exception
     */
    @Override
    public String uploadFile(MultipartFile file) throws Exception
    {
        InputStream inputStream = file.getInputStream();
        StorePath storePath = storageClient.uploadFile(inputStream, file.getSize(),
                FileTypeUtils.getExtension(file), null);
        IoUtils.closeQuietly(inputStream);
        return domain + "/" + storePath.getFullPath();
    }
}
se-modules/se-system/src/main/java/com/se/system/service/impl/LocalSysFileServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package com.se.system.service.impl;
import com.se.system.service.inte.ISysFileService;
import com.se.system.utils.FileUploadUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
/**
 * æœ¬åœ°æ–‡ä»¶å­˜å‚¨
 *
 * @author admin
 */
@Primary
@Service
public class LocalSysFileServiceImpl implements ISysFileService
{
    /**
     * èµ„源映射路径 å‰ç¼€
     */
    @Value("${file.prefix}")
    public String localFilePrefix;
    /**
     * åŸŸåæˆ–本机访问地址
     */
    @Value("${file.domain}")
    public String domain;
    /**
     * ä¸Šä¼ æ–‡ä»¶å­˜å‚¨åœ¨æœ¬åœ°çš„æ ¹è·¯å¾„
     */
    @Value("${file.path}")
    private String localFilePath;
    /**
     * æœ¬åœ°æ–‡ä»¶ä¸Šä¼ æŽ¥å£
     *
     * @param file ä¸Šä¼ çš„æ–‡ä»¶
     * @return è®¿é—®åœ°å€
     * @throws Exception
     */
    @Override
    public String uploadFile(MultipartFile file) throws Exception
    {
        String name = FileUploadUtils.upload(localFilePath, file);
        String url = domain + localFilePrefix + name;
        return url;
    }
}
se-modules/se-system/src/main/java/com/se/system/service/impl/MinioSysFileServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package com.se.system.service.impl;
import com.alibaba.nacos.common.utils.IoUtils;
import com.se.system.config.MinioConfig;
import com.se.system.service.inte.ISysFileService;
import com.se.system.utils.FileUploadUtils;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.InputStream;
/**
 * Minio æ–‡ä»¶å­˜å‚¨
 *
 * @author admin
 */
@Service
public class MinioSysFileServiceImpl implements ISysFileService
{
    @Resource
    private MinioConfig minioConfig;
    @Resource
    private MinioClient client;
    /**
     * Minio文件上传接口
     *
     * @param file ä¸Šä¼ çš„æ–‡ä»¶
     * @return è®¿é—®åœ°å€
     * @throws Exception
     */
    @Override
    public String uploadFile(MultipartFile file) throws Exception
    {
        String fileName = FileUploadUtils.extractFilename(file);
        InputStream inputStream = file.getInputStream();
        PutObjectArgs args = PutObjectArgs.builder()
                .bucket(minioConfig.getBucketName())
                .object(fileName)
                .stream(inputStream, file.getSize(), -1)
                .contentType(file.getContentType())
                .build();
        client.putObject(args);
        IoUtils.closeQuietly(inputStream);
        return minioConfig.getUrl() + "/" + minioConfig.getBucketName() + "/" + fileName;
    }
}
se-modules/se-system/src/main/java/com/se/system/service/inte/ISysFileService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.se.system.service.inte;
import org.springframework.web.multipart.MultipartFile;
/**
 * æ–‡ä»¶ä¸Šä¼ æŽ¥å£
 *
 * @author admin
 */
public interface ISysFileService
{
    /**
     * æ–‡ä»¶ä¸Šä¼ æŽ¥å£
     *
     * @param file ä¸Šä¼ çš„æ–‡ä»¶
     * @return è®¿é—®åœ°å€
     * @throws Exception
     */
    public String uploadFile(MultipartFile file) throws Exception;
}
se-modules/se-system/src/main/java/com/se/system/utils/FileUploadUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,186 @@
package com.se.system.utils;
import com.se.common.core.exception.file.FileException;
import com.se.common.core.exception.file.FileNameLengthLimitExceededException;
import com.se.common.core.exception.file.FileSizeLimitExceededException;
import com.se.common.core.exception.file.InvalidExtensionException;
import com.se.common.core.utils.DateUtils;
import com.se.common.core.utils.StringUtils;
import com.se.common.core.utils.file.FileTypeUtils;
import com.se.common.core.utils.file.MimeTypeUtils;
import com.se.common.core.utils.uuid.Seq;
import org.apache.commons.io.FilenameUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;
import java.util.Objects;
/**
 * æ–‡ä»¶ä¸Šä¼ å·¥å…·ç±»
 *
 * @author admin
 */
public class FileUploadUtils
{
    /**
     * é»˜è®¤å¤§å° 50M
     */
    public static final long DEFAULT_MAX_SIZE = 50 * 1024 * 1024L;
    /**
     * é»˜è®¤çš„æ–‡ä»¶åæœ€å¤§é•¿åº¦ 100
     */
    public static final int DEFAULT_FILE_NAME_LENGTH = 100;
    /**
     * æ ¹æ®æ–‡ä»¶è·¯å¾„上传
     *
     * @param baseDir ç›¸å¯¹åº”用的基目录
     * @param file ä¸Šä¼ çš„æ–‡ä»¶
     * @return æ–‡ä»¶åç§°
     * @throws IOException
     */
    public static final String upload(String baseDir, MultipartFile file) throws IOException
    {
        try
        {
            return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION);
        }
        catch (FileException fe)
        {
            throw new IOException(fe.getDefaultMessage(), fe);
        }
        catch (Exception e)
        {
            throw new IOException(e.getMessage(), e);
        }
    }
    /**
     * æ–‡ä»¶ä¸Šä¼ 
     *
     * @param baseDir ç›¸å¯¹åº”用的基目录
     * @param file ä¸Šä¼ çš„æ–‡ä»¶
     * @param allowedExtension ä¸Šä¼ æ–‡ä»¶ç±»åž‹
     * @return è¿”回上传成功的文件名
     * @throws FileSizeLimitExceededException å¦‚果超出最大大小
     * @throws FileNameLengthLimitExceededException æ–‡ä»¶åå¤ªé•¿
     * @throws IOException æ¯”如读写文件出错时
     * @throws InvalidExtensionException æ–‡ä»¶æ ¡éªŒå¼‚常
     */
    public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension)
            throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
            InvalidExtensionException
    {
        int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length();
        if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
        {
            throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH);
        }
        assertAllowed(file, allowedExtension);
        String fileName = extractFilename(file);
        String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath();
        file.transferTo(Paths.get(absPath));
        return getPathFileName(fileName);
    }
    /**
     * ç¼–码文件名
     */
    public static final String extractFilename(MultipartFile file)
    {
        return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(),
                FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), FileTypeUtils.getExtension(file));
    }
    private 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())
            {
                desc.getParentFile().mkdirs();
            }
        }
        return desc.isAbsolute() ? desc : desc.getAbsoluteFile();
    }
    private static final String getPathFileName(String fileName) throws IOException
    {
        String pathFileName = "/" + fileName;
        return pathFileName;
    }
    /**
     * æ–‡ä»¶å¤§å°æ ¡éªŒ
     *
     * @param file ä¸Šä¼ çš„æ–‡ä»¶
     * @throws FileSizeLimitExceededException å¦‚果超出最大大小
     * @throws InvalidExtensionException æ–‡ä»¶æ ¡éªŒå¼‚常
     */
    public static final void assertAllowed(MultipartFile file, String[] allowedExtension)
            throws FileSizeLimitExceededException, InvalidExtensionException
    {
        long size = file.getSize();
        if (size > DEFAULT_MAX_SIZE)
        {
            throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024);
        }
        String fileName = file.getOriginalFilename();
        String extension = FileTypeUtils.getExtension(file);
        if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension))
        {
            if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION)
            {
                throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension,
                        fileName);
            }
            else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION)
            {
                throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension,
                        fileName);
            }
            else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION)
            {
                throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension,
                        fileName);
            }
            else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION)
            {
                throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension,
                        fileName);
            }
            else
            {
                throw new InvalidExtensionException(allowedExtension, extension, fileName);
            }
        }
    }
    /**
     * åˆ¤æ–­MIME类型是否是允许的MIME类型
     *
     * @param extension ä¸Šä¼ æ–‡ä»¶ç±»åž‹
     * @param allowedExtension å…è®¸ä¸Šä¼ æ–‡ä»¶ç±»åž‹
     * @return true/false
     */
    public static final boolean isAllowedExtension(String extension, String[] allowedExtension)
    {
        for (String str : allowedExtension)
        {
            if (str.equalsIgnoreCase(extension))
            {
                return true;
            }
        }
        return false;
    }
}
˵Ã÷.txt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
se-system-dev.yml,添加
# æœ¬åœ°æ–‡ä»¶ä¸Šä¼ 
file:
    domain: http://127.0.0.1:9300
    path: D:/se/uploadPath
    prefix: /statics
# FastDFS配置
fdfs:
  domain: http://8.129.231.12
  soTimeout: 3000
  connectTimeout: 2000
  trackerList: 8.129.231.12:22122
# Minio配置
minio:
  url: http://8.129.231.12:9000
  accessKey: minioadmin
  secretKey: minioadmin
  bucketName: test