diff --git a/src/main/java/com/bao/dating/controller/UserController.java b/src/main/java/com/bao/dating/controller/UserController.java index 5c2f323..d530366 100644 --- a/src/main/java/com/bao/dating/controller/UserController.java +++ b/src/main/java/com/bao/dating/controller/UserController.java @@ -10,6 +10,9 @@ import com.bao.dating.pojo.vo.UserLoginVO; import com.bao.dating.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; @RestController @RequestMapping("/user") @@ -28,10 +31,36 @@ public class UserController { return Result.success(ResultCode.SUCCESS, "登录成功", userloginVO); } + /** + * 获取用户信息 + * @return 用户信息 + */ @GetMapping("/info") public Result getUserInfo() { Long userId = UserContext.getUserId(); UserInfoVO userInfoVO = userService.getUserInfo(userId); return Result.success(ResultCode.SUCCESS, "获取用户信息成功", userInfoVO); } + + /** + * 上传头像接口 + * @param file 头像文件 + * @return 上传后的文件URL列表 + */ + @PostMapping(value = "/info/uploadAvatar", consumes = "multipart/form-data") + public Result uploadAvatar(@RequestParam("file") MultipartFile file) { + String fileUrl = userService.uploadAvatar(file); + return Result.success(ResultCode.SUCCESS_REVIEW, "头像上传成功", fileUrl); + } + + /** + * 上传背景接口 + * @param file 背景文件 + * @return 上传后的文件URL列表 + */ + @PostMapping(value = "/info/uploadBackground", consumes = "multipart/form-data") + public Result uploadBackground(@RequestParam("file") MultipartFile file) { + String fileUrl = userService.uploadBackground(file); + return Result.success(ResultCode.SUCCESS_REVIEW, "背景上传成功", fileUrl); + } } diff --git a/src/main/java/com/bao/dating/pojo/vo/UserInfoVO.java b/src/main/java/com/bao/dating/pojo/vo/UserInfoVO.java index 1fcbf05..83fd640 100644 --- a/src/main/java/com/bao/dating/pojo/vo/UserInfoVO.java +++ b/src/main/java/com/bao/dating/pojo/vo/UserInfoVO.java @@ -20,4 +20,5 @@ public class UserInfoVO { private List hobbies; private String signature; private LocalDateTime createdAt; + private LocalDateTime updatedAt; } diff --git a/src/main/java/com/bao/dating/service/UserService.java b/src/main/java/com/bao/dating/service/UserService.java index 01f4e41..ab5ed64 100644 --- a/src/main/java/com/bao/dating/service/UserService.java +++ b/src/main/java/com/bao/dating/service/UserService.java @@ -4,6 +4,9 @@ import com.bao.dating.pojo.dto.UserLoginDTO; import com.bao.dating.pojo.vo.PostEditVO; import com.bao.dating.pojo.vo.UserInfoVO; import com.bao.dating.pojo.vo.UserLoginVO; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; public interface UserService { /** @@ -18,4 +21,18 @@ public interface UserService { * @param userId 动态ID */ UserInfoVO getUserInfo(Long userId); + + /** + * 上传头像 + * @param file 头像文件 + * @return 上传后的文件URL列表 + */ + String uploadAvatar(MultipartFile file); + + /** + * 上传背景 + * @param file 背景文件 + * @return 上传后的文件URL列表 + */ + String uploadBackground(MultipartFile file); } diff --git a/src/main/java/com/bao/dating/service/impl/PostServiceImpl.java b/src/main/java/com/bao/dating/service/impl/PostServiceImpl.java index c4b323b..e759ddc 100644 --- a/src/main/java/com/bao/dating/service/impl/PostServiceImpl.java +++ b/src/main/java/com/bao/dating/service/impl/PostServiceImpl.java @@ -20,10 +20,7 @@ import java.io.IOException; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; /** * 动态服务实现类 @@ -52,34 +49,55 @@ public class PostServiceImpl implements PostService { */ @Override public List uploadMedia(MultipartFile[] files) { + // 如果没有文件,则返回空列表 + if (files == null || files.length == 0) { + return Collections.emptyList(); + } + // 创建媒体文件列表 List mediaUrls = new ArrayList<>(); - if (files != null && files.length > 0) { + for (MultipartFile file : files) { - if (!file.isEmpty()) { + // 跳过空文件 + if (file == null || file.isEmpty()) { + continue; + } + // 获取文件名并跳过空文件 + String originalFilename = file.getOriginalFilename(); + if (originalFilename == null) { + continue; + } + // 校验文件类型 + String fileType = FileUtil.getFileType(originalFilename); + if (!"image".equals(fileType) && !"video".equals(fileType)) { + throw new RuntimeException("不支持的文件类型:" + originalFilename); + } + + // 创建目录 + String dir = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM")); + // 获取文件扩展名 + String extension = FileUtil.getFileExtension(originalFilename); + // 生成唯一文件名 + String newFileName = UUID.randomUUID().toString().replace("-", "") + "." + extension; + // 获取用户ID + Long userId = UserContext.getUserId(); + // 创建文件名 + String fileName = "post/" + userId + "/" + dir + "/" + newFileName; + try { - // 根据文件扩展名判断文件类型 - String fileType = FileUtil.getFileType(file.getOriginalFilename()); - // 创建目录 - String dir = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM")); - // 生成唯一文件名 - String newFileName = UUID.randomUUID().toString() + "." + FileUtil.getFileExtension(file.getOriginalFilename()); - String fileName = "post/" + dir + "/" + newFileName; // 获取文件字节数据 byte[] fileBytes = file.getBytes(); - // 根据文件类型处理 - String ossUrl = ""; - if ("image".equals(fileType) || "video".equals(fileType)) { - // 上传图片或视频 - ossUrl = ossUtil.upload(fileBytes, fileName); + // 上传图片或视频 + String ossUrl = ossUtil.upload(fileBytes, fileName); + if (ossUrl == null || ossUrl.isEmpty()) { + throw new RuntimeException("文件上传失败:" + originalFilename); } // 添加上传后的 URL mediaUrls.add(ossUrl); } catch (IOException e) { - e.printStackTrace(); + // 统一异常处理 + throw new RuntimeException("上传媒体文件失败:" + originalFilename, e); } } - } - } return mediaUrls; } diff --git a/src/main/java/com/bao/dating/service/impl/UserServiceImpl.java b/src/main/java/com/bao/dating/service/impl/UserServiceImpl.java index 43f854c..3aac7da 100644 --- a/src/main/java/com/bao/dating/service/impl/UserServiceImpl.java +++ b/src/main/java/com/bao/dating/service/impl/UserServiceImpl.java @@ -1,20 +1,32 @@ package com.bao.dating.service.impl; +import com.bao.dating.common.aliyun.AliOssUtil; +import com.bao.dating.context.UserContext; import com.bao.dating.mapper.UserMapper; import com.bao.dating.pojo.dto.UserLoginDTO; import com.bao.dating.pojo.entity.User; import com.bao.dating.pojo.vo.UserInfoVO; import com.bao.dating.pojo.vo.UserLoginVO; import com.bao.dating.service.UserService; +import com.bao.dating.util.FileUtil; import com.bao.dating.util.JwtUtil; import com.bao.dating.util.MD5Util; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.UUID; @Service public class UserServiceImpl implements UserService { + @Autowired + private AliOssUtil ossUtil; + @Autowired private UserMapper userMapper; @@ -68,4 +80,81 @@ public class UserServiceImpl implements UserService { BeanUtils.copyProperties(user, userInfoVO); return userInfoVO; } + + @Override + public String uploadAvatar(MultipartFile file) { + // 参数校验 + if (file == null || file.isEmpty()) { + throw new RuntimeException("图片不存在"); + } + + String originalFilename = file.getOriginalFilename(); + if (originalFilename == null) { + throw new RuntimeException("文件名非法"); + } + + String fileType = FileUtil.getFileType(originalFilename); + if (!"image".equals(fileType)) { + throw new RuntimeException("仅支持图片上传"); + } + + //生成 OSS 路径 + String dir = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM")); + String extension = FileUtil.getFileExtension(originalFilename); + String fileName = UUID.randomUUID().toString().replace("-", "") + "." + extension; + Long userId = UserContext.getUserId(); + String objectKey = "user/" + userId + "/avatar/" + fileName; + + try { + byte[] fileBytes = file.getBytes(); + String ossUrl = ossUtil.upload(fileBytes, objectKey); + + if (ossUrl == null || ossUrl.isEmpty()) { + throw new RuntimeException("图片上传失败"); + } + + return ossUrl; + + } catch (Exception e) { + throw new RuntimeException("上传图片失败", e); + } + } + + @Override + public String uploadBackground(MultipartFile file) { + // 参数校验 + if (file == null || file.isEmpty()) { + throw new RuntimeException("图片不存在"); + } + + String originalFilename = file.getOriginalFilename(); + if (originalFilename == null) { + throw new RuntimeException("文件名非法"); + } + + String fileType = FileUtil.getFileType(originalFilename); + if (!"image".equals(fileType)) { + throw new RuntimeException("仅支持图片上传"); + } + + //生成 OSS 路径 + String extension = FileUtil.getFileExtension(originalFilename); + String fileName = UUID.randomUUID().toString().replace("-", "") + "." + extension; + Long userId = UserContext.getUserId(); + String objectKey = "user/" + userId + "/background/" + fileName; + + try { + byte[] fileBytes = file.getBytes(); + String ossUrl = ossUtil.upload(fileBytes, objectKey); + + if (ossUrl == null || ossUrl.isEmpty()) { + throw new RuntimeException("图片上传失败"); + } + + return ossUrl; + + } catch (Exception e) { + throw new RuntimeException("上传图片失败", e); + } + } }