完成头像和背景上传,优化动态文件上传,修bug
This commit is contained in:
@@ -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<UserInfoVO> 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<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 String signature;
|
||||
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.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);
|
||||
}
|
||||
|
||||
@@ -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<String> uploadMedia(MultipartFile[] files) {
|
||||
// 如果没有文件,则返回空列表
|
||||
if (files == null || files.length == 0) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
// 创建媒体文件列表
|
||||
List<String> 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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user