From fb2425ac7008c3d9f3a44204116e421ed27d0a53 Mon Sep 17 00:00:00 2001 From: RuoYi Date: Fri, 6 Jun 2025 14:02:22 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=A4=B4=E5=83=8F=E6=9B=B4?= =?UTF-8?q?=E6=8D=A2=E5=90=8E=E7=A7=BB=E9=99=A4=E6=97=A7=E5=A4=B4=E5=83=8F?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/utils/file/FileUploadUtils.java | 36 ++++++++++++++++--- .../ruoyi/common/utils/file/FileUtils.java | 12 +++++++ .../project/common/CommonController.java | 3 +- .../user/controller/ProfileController.java | 14 +++++--- .../system/user/mapper/UserMapper.java | 12 ++++++- .../system/user/service/IUserService.java | 9 +++++ .../system/user/service/UserServiceImpl.java | 12 +++++++ .../resources/mybatis/system/UserMapper.xml | 4 +++ 8 files changed, 91 insertions(+), 11 deletions(-) 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