完成头像和背景上传,优化动态文件上传,修bug
This commit is contained in:
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user