完成头像和背景上传,优化动态文件上传,修bug

This commit is contained in:
KilLze
2025-12-28 21:10:55 +08:00
parent 0f8f47de8e
commit fca54a6f97
5 changed files with 175 additions and 21 deletions

View File

@@ -10,6 +10,9 @@ import com.bao.dating.pojo.vo.UserLoginVO;
import com.bao.dating.service.UserService; import com.bao.dating.service.UserService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@RestController @RestController
@RequestMapping("/user") @RequestMapping("/user")
@@ -28,10 +31,36 @@ public class UserController {
return Result.success(ResultCode.SUCCESS, "登录成功", userloginVO); return Result.success(ResultCode.SUCCESS, "登录成功", userloginVO);
} }
/**
* 获取用户信息
* @return 用户信息
*/
@GetMapping("/info") @GetMapping("/info")
public Result<UserInfoVO> getUserInfo() { public Result<UserInfoVO> getUserInfo() {
Long userId = UserContext.getUserId(); Long userId = UserContext.getUserId();
UserInfoVO userInfoVO = userService.getUserInfo(userId); UserInfoVO userInfoVO = userService.getUserInfo(userId);
return Result.success(ResultCode.SUCCESS, "获取用户信息成功", userInfoVO); return Result.success(ResultCode.SUCCESS, "获取用户信息成功", userInfoVO);
} }
/**
* 上传头像接口
* @param file 头像文件
* @return 上传后的文件URL列表
*/
@PostMapping(value = "/info/uploadAvatar", consumes = "multipart/form-data")
public Result<String> 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<String> uploadBackground(@RequestParam("file") MultipartFile file) {
String fileUrl = userService.uploadBackground(file);
return Result.success(ResultCode.SUCCESS_REVIEW, "背景上传成功", fileUrl);
}
} }

View File

@@ -20,4 +20,5 @@ public class UserInfoVO {
private List<String> hobbies; private List<String> hobbies;
private String signature; private String signature;
private LocalDateTime createdAt; private LocalDateTime createdAt;
private LocalDateTime updatedAt;
} }

View File

@@ -4,6 +4,9 @@ import com.bao.dating.pojo.dto.UserLoginDTO;
import com.bao.dating.pojo.vo.PostEditVO; import com.bao.dating.pojo.vo.PostEditVO;
import com.bao.dating.pojo.vo.UserInfoVO; import com.bao.dating.pojo.vo.UserInfoVO;
import com.bao.dating.pojo.vo.UserLoginVO; import com.bao.dating.pojo.vo.UserLoginVO;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
public interface UserService { public interface UserService {
/** /**
@@ -18,4 +21,18 @@ public interface UserService {
* @param userId 动态ID * @param userId 动态ID
*/ */
UserInfoVO getUserInfo(Long userId); UserInfoVO getUserInfo(Long userId);
/**
* 上传头像
* @param file 头像文件
* @return 上传后的文件URL列表
*/
String uploadAvatar(MultipartFile file);
/**
* 上传背景
* @param file 背景文件
* @return 上传后的文件URL列表
*/
String uploadBackground(MultipartFile file);
} }

View File

@@ -20,10 +20,7 @@ import java.io.IOException;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.UUID;
/** /**
* 动态服务实现类 * 动态服务实现类
@@ -52,32 +49,53 @@ public class PostServiceImpl implements PostService {
*/ */
@Override @Override
public List<String> uploadMedia(MultipartFile[] files) { public List<String> uploadMedia(MultipartFile[] files) {
// 如果没有文件,则返回空列表
if (files == null || files.length == 0) {
return Collections.emptyList();
}
// 创建媒体文件列表
List<String> mediaUrls = new ArrayList<>(); List<String> mediaUrls = new ArrayList<>();
if (files != null && files.length > 0) {
for (MultipartFile file : files) { for (MultipartFile file : files) {
if (!file.isEmpty()) { // 跳过空文件
try { if (file == null || file.isEmpty()) {
// 根据文件扩展名判断文件类型 continue;
String fileType = FileUtil.getFileType(file.getOriginalFilename()); }
// 获取文件名并跳过空文件
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 dir = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy/MM"));
// 获取文件扩展名
String extension = FileUtil.getFileExtension(originalFilename);
// 生成唯一文件名 // 生成唯一文件名
String newFileName = UUID.randomUUID().toString() + "." + FileUtil.getFileExtension(file.getOriginalFilename()); String newFileName = UUID.randomUUID().toString().replace("-", "") + "." + extension;
String fileName = "post/" + dir + "/" + newFileName; // 获取用户ID
Long userId = UserContext.getUserId();
// 创建文件名
String fileName = "post/" + userId + "/" + dir + "/" + newFileName;
try {
// 获取文件字节数据 // 获取文件字节数据
byte[] fileBytes = file.getBytes(); 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 // 添加上传后的 URL
mediaUrls.add(ossUrl); mediaUrls.add(ossUrl);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); // 统一异常处理
} throw new RuntimeException("上传媒体文件失败:" + originalFilename, e);
}
} }
} }
return mediaUrls; return mediaUrls;

View File

@@ -1,20 +1,32 @@
package com.bao.dating.service.impl; 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.mapper.UserMapper;
import com.bao.dating.pojo.dto.UserLoginDTO; import com.bao.dating.pojo.dto.UserLoginDTO;
import com.bao.dating.pojo.entity.User; import com.bao.dating.pojo.entity.User;
import com.bao.dating.pojo.vo.UserInfoVO; import com.bao.dating.pojo.vo.UserInfoVO;
import com.bao.dating.pojo.vo.UserLoginVO; import com.bao.dating.pojo.vo.UserLoginVO;
import com.bao.dating.service.UserService; import com.bao.dating.service.UserService;
import com.bao.dating.util.FileUtil;
import com.bao.dating.util.JwtUtil; import com.bao.dating.util.JwtUtil;
import com.bao.dating.util.MD5Util; import com.bao.dating.util.MD5Util;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; 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 @Service
public class UserServiceImpl implements UserService { public class UserServiceImpl implements UserService {
@Autowired
private AliOssUtil ossUtil;
@Autowired @Autowired
private UserMapper userMapper; private UserMapper userMapper;
@@ -68,4 +80,81 @@ public class UserServiceImpl implements UserService {
BeanUtils.copyProperties(user, userInfoVO); BeanUtils.copyProperties(user, userInfoVO);
return 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);
}
}
} }