87 lines
2.7 KiB
Java
87 lines
2.7 KiB
Java
package xin.merlin.myplayerbackend.service;
|
||
|
||
|
||
import lombok.RequiredArgsConstructor;
|
||
import org.springframework.beans.factory.annotation.Value;
|
||
import org.springframework.stereotype.Service;
|
||
import org.springframework.web.multipart.MultipartFile;
|
||
|
||
import java.io.File;
|
||
import java.io.IOException;
|
||
import java.nio.file.Files;
|
||
import java.nio.file.Path;
|
||
import java.nio.file.Paths;
|
||
import java.nio.file.StandardCopyOption;
|
||
import java.util.Arrays;
|
||
import java.util.List;
|
||
|
||
@Service
|
||
@RequiredArgsConstructor
|
||
public class UploadService {
|
||
|
||
@Value("${resources.user.avatar}")
|
||
private String userAvatarDir;
|
||
|
||
@Value("${resources.group.avatar}")
|
||
private String groupAvatarDir;
|
||
|
||
@Value("${resources.playroom.avatar}")
|
||
private String playroomAvatarDir;
|
||
|
||
@Value("${resources.public}")
|
||
private String publicAvatarDir;
|
||
|
||
private static final List<String> AVATAR_ALLOWED_EXTENSIONS = Arrays.asList(".jpg", ".jpeg", ".png", ".gif");
|
||
|
||
/**
|
||
* 上传用户、群组、放映室头像
|
||
* @param file 目标文件
|
||
* @param type 上传类型
|
||
* @param influence 受影响的id
|
||
* @return host后的访问url
|
||
* @throws IOException 抛出io异常
|
||
*/
|
||
public String uploadAvatar(MultipartFile file, Integer type,Integer influence) throws IOException {
|
||
String DIR = switch (type) {
|
||
case 1 -> userAvatarDir;
|
||
case 2 -> groupAvatarDir;
|
||
case 3 -> playroomAvatarDir;
|
||
default -> publicAvatarDir;
|
||
};
|
||
String fileName = getFilename(file, influence, DIR);
|
||
Path targetPath = Paths.get(DIR, fileName);
|
||
Files.copy(file.getInputStream(), targetPath, StandardCopyOption.REPLACE_EXISTING);
|
||
|
||
return "/resources/user/avatar/" + fileName; // 返回访问 URL
|
||
}
|
||
|
||
/**
|
||
*
|
||
* @param file 目标文件
|
||
* @param influence 受影响的id
|
||
* @param DIR 储存的位置
|
||
* @return fileName 文件在储存之后的名字
|
||
* @throws IOException 抛出io异常
|
||
*/
|
||
private static String getFilename(MultipartFile file, Integer influence, String DIR) throws IOException {
|
||
File dir = new File(DIR);
|
||
if (!dir.exists()) dir.mkdirs();
|
||
|
||
// 取文件扩展名并检查是否合法
|
||
String originalFileName = file.getOriginalFilename();
|
||
String fileExtension = "";
|
||
if (originalFileName != null && originalFileName.contains(".")) {
|
||
fileExtension = originalFileName.substring(originalFileName.lastIndexOf(".")).toLowerCase();
|
||
}
|
||
|
||
if (!AVATAR_ALLOWED_EXTENSIONS.contains(fileExtension)) {
|
||
throw new IOException("仅支持 JPG, PNG, GIF 格式");
|
||
}
|
||
|
||
// 以id进行命名,方便直接替换
|
||
return influence.toString() + fileExtension;
|
||
}
|
||
|
||
|
||
}
|