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;
}
}