ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/file/FileUtils.java
@@ -20,6 +20,12 @@ */ 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]+"; /** @@ -168,6 +174,57 @@ } /** * 返回文件名 * * @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)文件分隔符<br> * Windows平台下分隔符为\,Linux(Unix)为/ * * @param c 字符 * @return 是否为Windows或者Linux(Unix)文件分隔符 */ public static boolean isFileSeparator(char c) { return SLASH == c || BACKSLASH == c; } /** * 下载文件名重新编码 * * @param response 响应对象 ruoyi-modules/ruoyi-file/pom.xml
@@ -48,6 +48,13 @@ <version>${swagger.fox.version}</version> </dependency> <!-- FastDFS --> <dependency> <groupId>com.github.tobato</groupId> <artifactId>fastdfs-client</artifactId> <version>1.26.5</version> </dependency> <!-- Ruoyi Common Security --> <dependency> <groupId>com.ruoyi</groupId> ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/controller/SysFileController.java
@@ -8,6 +8,7 @@ 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 @@ @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 @@ { 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); } ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/FastDfsSysFileServiceImpl.java
New file @@ -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(); } } ruoyi-modules/ruoyi-file/src/main/java/com/ruoyi/file/service/ISysFileService.java
@@ -14,7 +14,7 @@ * * @param file 上传的文件 * @param baseDir 相对应用的基目录 * @return 文件名称 * @return 访问地址 * @throws Exception */ public String uploadFile(MultipartFile file, String baseDir) throws Exception; 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 @@ * * @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; } }