From 3b27a85952e57c166b596e2e57a3c2d91ef13109 Mon Sep 17 00:00:00 2001 From: RuoYi Date: Thu, 19 Nov 2020 18:51:22 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=86=E5=B8=83=E5=BC=8F?= =?UTF-8?q?=E6=96=87=E4=BB=B6FastDFS=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/utils/file/FileUtils.java | 57 +++++++++++++++++++ ruoyi-modules/ruoyi-file/pom.xml | 7 +++ .../file/controller/SysFileController.java | 20 ++----- .../service/FastDfsSysFileServiceImpl.java | 43 ++++++++++++++ .../ruoyi/file/service/ISysFileService.java | 2 +- .../file/service/LocalSysFileServiceImpl.java | 23 +++++++- 6 files changed, 132 insertions(+), 20 deletions(-) create mode 100644 ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/FastDfsSysFileServiceImpl.java diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileUtils.java b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileUtils.java index 24e850cb..9dfca168 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileUtils.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileUtils.java @@ -20,6 +20,12 @@ import com.ruoyi.common.core.utils.StringUtils; */ public class FileUtils extends org.apache.commons.io.FileUtils { + /** 字符常量:斜杠 {@code '/'} */ + public static final char SLASH = '/'; + + /** 字符常量:反斜杠 {@code '\\'} */ + public static final char BACKSLASH = '\\'; + public static String FILENAME_PATTERN = "[a-zA-Z0-9_\\-\\|\\.\\u4e00-\\u9fa5]+"; /** @@ -167,6 +173,57 @@ public class FileUtils extends org.apache.commons.io.FileUtils return filename; } + /** + * 返回文件名 + * + * @param filePath 文件 + * @return 文件名 + */ + public static String getName(String filePath) + { + if (null == filePath) + { + return null; + } + int len = filePath.length(); + if (0 == len) + { + return filePath; + } + if (isFileSeparator(filePath.charAt(len - 1))) + { + // 以分隔符结尾的去掉结尾分隔符 + len--; + } + + int begin = 0; + char c; + for (int i = len - 1; i > -1; i--) + { + c = filePath.charAt(i); + if (isFileSeparator(c)) + { + // 查找最后一个路径分隔符(/或者\) + begin = i + 1; + break; + } + } + + return filePath.substring(begin, len); + } + + /** + * 是否为Windows或者Linux(Unix)文件分隔符
+ * Windows平台下分隔符为\,Linux(Unix)为/ + * + * @param c 字符 + * @return 是否为Windows或者Linux(Unix)文件分隔符 + */ + public static boolean isFileSeparator(char c) + { + return SLASH == c || BACKSLASH == c; + } + /** * 下载文件名重新编码 * diff --git a/ruoyi-modules/ruoyi-file/pom.xml b/ruoyi-modules/ruoyi-file/pom.xml index 98d91752..2c882858 100644 --- a/ruoyi-modules/ruoyi-file/pom.xml +++ b/ruoyi-modules/ruoyi-file/pom.xml @@ -48,6 +48,13 @@ ${swagger.fox.version} + + + com.github.tobato + fastdfs-client + 1.26.5 + + com.ruoyi diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileController.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileController.java index 968cdc7a..0f5375d1 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileController.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileController.java @@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.utils.file.FileUtils; import com.ruoyi.file.service.ISysFileService; import com.ruoyi.system.api.domain.SysFile; @@ -27,18 +28,6 @@ public class SysFileController @Value("${file.path}") private String localFilePath; - /** - * 资源映射路径 前缀 - */ - @Value("${file.prefix}") - public String localFilePrefix; - - /** - * 域名或本机访问地址 - */ - @Value("${file.domain}") - public String domain; - @Autowired private ISysFileService sysFileService; @@ -50,11 +39,10 @@ public class SysFileController { try { - // 上传并返回新文件名称 - String fileName = sysFileService.uploadFile(file, localFilePath); - String url = domain + localFilePrefix + fileName; + // 上传并返回访问地址 + String url = sysFileService.uploadFile(file, localFilePath); SysFile sysFile = new SysFile(); - sysFile.setName(fileName); + sysFile.setName(FileUtils.getName(url)); sysFile.setUrl(url); return R.ok(sysFile); } diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/FastDfsSysFileServiceImpl.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/FastDfsSysFileServiceImpl.java new file mode 100644 index 00000000..202fdab5 --- /dev/null +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/FastDfsSysFileServiceImpl.java @@ -0,0 +1,43 @@ +package com.ruoyi.file.service; + +import org.apache.commons.io.FilenameUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import com.github.tobato.fastdfs.domain.fdfs.StorePath; +import com.github.tobato.fastdfs.service.FastFileStorageClient; + +/** + * FastDFS文件存储 + * + * @author ruoyi + */ +@Service +public class FastDfsSysFileServiceImpl implements ISysFileService +{ + /** + * 域名或本机访问地址 + */ + @Value("${fdfs.domain}") + public String domain; + + @Autowired + private FastFileStorageClient storageClient; + + /** + * FastDfs文件上传接口 + * + * @param file 上传的文件 + * @param baseDir 相对应用的基目录 + * @return 访问地址 + * @throws Exception + */ + @Override + public String uploadFile(MultipartFile file, String baseDir) throws Exception + { + StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(), + FilenameUtils.getExtension(file.getOriginalFilename()), null); + return domain + "/" + storePath.getFullPath(); + } +} diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileService.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileService.java index a4b5d356..ff962538 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileService.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileService.java @@ -14,7 +14,7 @@ public interface ISysFileService * * @param file 上传的文件 * @param baseDir 相对应用的基目录 - * @return 文件名称 + * @return 访问地址 * @throws Exception */ public String uploadFile(MultipartFile file, String baseDir) throws Exception; diff --git a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java index 02f25415..ca5b8b97 100644 --- a/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java +++ b/ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/LocalSysFileServiceImpl.java @@ -1,5 +1,7 @@ package com.ruoyi.file.service; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import com.ruoyi.file.utils.FileUploadUtils; @@ -9,19 +11,34 @@ import com.ruoyi.file.utils.FileUploadUtils; * * @author ruoyi */ +@Primary @Service public class LocalSysFileServiceImpl implements ISysFileService { /** - * 文件上传接口 + * 资源映射路径 前缀 + */ + @Value("${file.prefix}") + public String localFilePrefix; + + /** + * 域名或本机访问地址 + */ + @Value("${file.domain}") + public String domain; + + /** + * 本地文件上传接口 * * @param file 上传的文件 * @param baseDir 相对应用的基目录 - * @return 文件名称 + * @return 访问地址 * @throws Exception */ public String uploadFile(MultipartFile file, String baseDir) throws Exception { - return FileUploadUtils.upload(baseDir, file); + String name = FileUploadUtils.upload(baseDir, file); + String url = domain + localFilePrefix + name; + return url; } }