diff --git a/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java b/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java
index 7ffde0d4..1fd045ea 100644
--- a/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java
+++ b/src/main/java/com/ruoyi/common/utils/file/FileUploadUtils.java
@@ -12,6 +12,7 @@ import com.ruoyi.common.exception.file.FileSizeLimitExceededException;
import com.ruoyi.common.exception.file.InvalidExtensionException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.common.utils.uuid.IdUtils;
import com.ruoyi.common.utils.uuid.Seq;
import com.ruoyi.framework.config.RuoYiConfig;
@@ -101,6 +102,26 @@ public class FileUploadUtils
public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension)
throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
InvalidExtensionException
+ {
+ return upload(baseDir, file, allowedExtension, false);
+ }
+
+ /**
+ * 文件上传
+ *
+ * @param baseDir 相对应用的基目录
+ * @param file 上传的文件
+ * @param useCustomNaming 系统自定义文件名
+ * @param allowedExtension 上传文件类型
+ * @return 返回上传成功的文件名
+ * @throws FileSizeLimitExceededException 如果超出最大大小
+ * @throws FileNameLengthLimitExceededException 文件名太长
+ * @throws IOException 比如读写文件出错时
+ * @throws InvalidExtensionException 文件校验异常
+ */
+ public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension, boolean useCustomNaming)
+ throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException,
+ InvalidExtensionException
{
int fileNameLength = Objects.requireNonNull(file.getOriginalFilename()).length();
if (fileNameLength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH)
@@ -110,7 +131,7 @@ public class FileUploadUtils
assertAllowed(file, allowedExtension);
- String fileName = extractFilename(file);
+ String fileName = useCustomNaming ? uuidFilename(file) : extractFilename(file);
String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath();
file.transferTo(Paths.get(absPath));
@@ -118,12 +139,19 @@ public class FileUploadUtils
}
/**
- * 编码文件名
+ * 编码文件名(日期格式目录 + 原文件名 + 序列值 + 后缀)
*/
public static final String extractFilename(MultipartFile file)
{
- return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(),
- FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), getExtension(file));
+ return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(), FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), getExtension(file));
+ }
+
+ /**
+ * 编编码文件名(日期格式目录 + UUID + 后缀)
+ */
+ public static final String uuidFilename(MultipartFile file)
+ {
+ return StringUtils.format("{}/{}.{}", DateUtils.datePath(), IdUtils.fastSimpleUUID(), getExtension(file));
}
public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException
diff --git a/src/main/java/com/ruoyi/common/utils/file/FileUtils.java b/src/main/java/com/ruoyi/common/utils/file/FileUtils.java
index 53090e51..b6566251 100644
--- a/src/main/java/com/ruoyi/common/utils/file/FileUtils.java
+++ b/src/main/java/com/ruoyi/common/utils/file/FileUtils.java
@@ -14,6 +14,7 @@ import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.ArrayUtils;
+import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.uuid.IdUtils;
@@ -103,6 +104,17 @@ public class FileUtils
return FileUploadUtils.getPathFileName(uploadDir, pathName);
}
+ /**
+ * 移除路径中的请求前缀片段
+ *
+ * @param filePath 文件路径
+ * @return 移除后的文件路径
+ */
+ public static String stripPrefix(String filePath)
+ {
+ return StringUtils.substringAfter(filePath, Constants.RESOURCE_PREFIX);
+ }
+
/**
* 删除文件
*
diff --git a/src/main/java/com/ruoyi/project/common/CommonController.java b/src/main/java/com/ruoyi/project/common/CommonController.java
index 405d7097..a58e36b2 100644
--- a/src/main/java/com/ruoyi/project/common/CommonController.java
+++ b/src/main/java/com/ruoyi/project/common/CommonController.java
@@ -14,7 +14,6 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
-import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
@@ -150,7 +149,7 @@ public class CommonController
// 本地资源路径
String localPath = RuoYiConfig.getProfile();
// 数据库资源地址
- String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX);
+ String downloadPath = localPath + FileUtils.stripPrefix(resource);
// 下载名称
String downloadName = StringUtils.substringAfterLast(downloadPath, "/");
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
diff --git a/src/main/java/com/ruoyi/project/system/user/controller/ProfileController.java b/src/main/java/com/ruoyi/project/system/user/controller/ProfileController.java
index f474ffbf..f97b71f8 100644
--- a/src/main/java/com/ruoyi/project/system/user/controller/ProfileController.java
+++ b/src/main/java/com/ruoyi/project/system/user/controller/ProfileController.java
@@ -14,6 +14,7 @@ import org.springframework.web.multipart.MultipartFile;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
+import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.common.utils.file.MimeTypeUtils;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
@@ -160,11 +161,16 @@ public class ProfileController extends BaseController
{
if (!file.isEmpty())
{
- String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION);
- currentUser.setAvatar(avatar);
- if (userService.updateUserInfo(currentUser) > 0)
+ String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION, true);
+ if (userService.updateUserAvatar(currentUser.getUserId(), avatar))
{
- setSysUser(userService.selectUserById(currentUser.getUserId()));
+ String oldAvatar = currentUser.getAvatar();
+ if (StringUtils.isNotEmpty(oldAvatar))
+ {
+ FileUtils.deleteFile(RuoYiConfig.getProfile() + FileUtils.stripPrefix(oldAvatar));
+ }
+ currentUser.setAvatar(avatar);
+ setSysUser(currentUser);
return success();
}
}
diff --git a/src/main/java/com/ruoyi/project/system/user/mapper/UserMapper.java b/src/main/java/com/ruoyi/project/system/user/mapper/UserMapper.java
index 0c2c9c68..68c7250f 100644
--- a/src/main/java/com/ruoyi/project/system/user/mapper/UserMapper.java
+++ b/src/main/java/com/ruoyi/project/system/user/mapper/UserMapper.java
@@ -1,7 +1,8 @@
package com.ruoyi.project.system.user.mapper;
-import com.ruoyi.project.system.user.domain.User;
import java.util.List;
+import org.apache.ibatis.annotations.Param;
+import com.ruoyi.project.system.user.domain.User;
/**
* 用户表 数据层
@@ -90,6 +91,15 @@ public interface UserMapper
*/
public int updateUser(User user);
+ /**
+ * 修改用户头像
+ *
+ * @param userId 用户ID
+ * @param avatar 头像地址
+ * @return 结果
+ */
+ public int updateUserAvatar(@Param("userId") Long userId, @Param("avatar") String avatar);
+
/**
* 新增用户信息
*
diff --git a/src/main/java/com/ruoyi/project/system/user/service/IUserService.java b/src/main/java/com/ruoyi/project/system/user/service/IUserService.java
index 241f5069..cdf6a666 100644
--- a/src/main/java/com/ruoyi/project/system/user/service/IUserService.java
+++ b/src/main/java/com/ruoyi/project/system/user/service/IUserService.java
@@ -124,6 +124,15 @@ public interface IUserService
*/
public int updateUserInfo(User user);
+ /**
+ * 修改用户头像
+ *
+ * @param userId 用户ID
+ * @param avatar 头像地址
+ * @return 结果
+ */
+ public boolean updateUserAvatar(Long userId, String avatar);
+
/**
* 用户授权角色
*
diff --git a/src/main/java/com/ruoyi/project/system/user/service/UserServiceImpl.java b/src/main/java/com/ruoyi/project/system/user/service/UserServiceImpl.java
index 0b8850fc..38e60aa2 100644
--- a/src/main/java/com/ruoyi/project/system/user/service/UserServiceImpl.java
+++ b/src/main/java/com/ruoyi/project/system/user/service/UserServiceImpl.java
@@ -287,6 +287,18 @@ public class UserServiceImpl implements IUserService
return userMapper.updateUser(user);
}
+ /**
+ * 修改用户头像
+ *
+ * @param userId 用户ID
+ * @param avatar 头像地址
+ * @return 结果
+ */
+ public boolean updateUserAvatar(Long userId, String avatar)
+ {
+ return userMapper.updateUserAvatar(userId, avatar) > 0;
+ }
+
/**
* 用户授权角色
*
diff --git a/src/main/resources/mybatis/system/UserMapper.xml b/src/main/resources/mybatis/system/UserMapper.xml
index a59a3c11..9d739492 100644
--- a/src/main/resources/mybatis/system/UserMapper.xml
+++ b/src/main/resources/mybatis/system/UserMapper.xml
@@ -166,6 +166,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+
+ update sys_user set avatar = #{avatar} where user_id = #{userId}
+
+
update sys_user