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