파일업로드를 한 뒤, 외부파일에 저장된 파일을 불러오긴 했지만, 서로 다른 사진사이즈이다 보니, 부트스크랩에 적용시킨 CSS를 건들 수는 없어서, 사진을 등록할 때 여러 사이즈를 등록하기로 했다.
그래서 이용할 건 thumbnailator 라이브러를 이용하려 한다.
이걸 사용해 파일 한개를 등록했을 때 원본파일, 200x200사이즈(S), 400x400사이즈(M) 총 3개를 등록하게 하려한다.
1. pom.xml
dependency추가
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
2. vo추가
imageName: 섬네일로 복제된 파일이름
flag: 사이즈 S, M
imageList: 저장하려는 파일, S, M 총 3개를 list에 넣어 포문을 돌릴 예정
public class FileInfo {
private Integer id;
private Integer refId;
private String filepath;
private String originalFilename;
private String systemFilename;
private String uploadResourcePath;
private String division;
private String bossType;
private Date createDate;
private String imageName;
private String flag;
private List<Map<String,Object>> imageList;
}
3. thumbnailator사용
3.1 이미지의 사이즈 확인 후 실행하기
public void insertFile(FileInfo fileInfo, List<MultipartFile> files)throws Exception {
List< FileInfo> list = new ArrayList< FileInfo>();
String currentDate = new SimpleDateFormat("yyyyMMdd").format(Calendar.getInstance().getTime());
String projectPath = fileRootPath + currentDate + "/";
String resourcePathName = uploadResourcePath + currentDate + "/";
File folder = new File(projectPath);
if(!folder.isDirectory()) {
folder.mkdirs();
}
if (null != files && files.size() > 0) {
for(MultipartFile multipartFile : files) {
UUID uuid = UUID.randomUUID();
String filename = uuid + "_" + multipartFile.getOriginalFilename();
File saveFile = new File(projectPath, filename);
multipartFile.transferTo(saveFile);
List<Map<String,Object>> imageList = new ArrayList<>();
imageList.add(new HashMap<String, Object>() {
{
put("name", filename);
put("flag", "O");
}
});
imageList.add(new HashMap<String, Object>() {
{
put("name", createTumbnail(projectPath, filename, 200, 200));
put("flag", "S");
}
});
imageList.add(new HashMap<String, Object>() {
{
put("name", createTumbnail(projectPath, filename, 400, 400));
put("flag", "M");
}
});
fileInfo.setSystemFilename(filename);
fileInfo.setOriginalFilename(multipartFile.getOriginalFilename());
fileInfo.setFilepath(resourcePathName);
imageList.forEach(obj -> {
FileInfo img = new FileInfo();
img.setRefId(fileInfo.getRefId());
img.setDivision(fileInfo.getDivision());
img.setImageName(obj.get("name").toString());
img.setFilepath(resourcePathName);
img.setFlag(obj.get("flag").toString());
img.setOriginalFilename(multipartFile.getOriginalFilename());
img.setSystemFilename(filename);
fileMapper.insertFile(img);
});
}
}
}
/**
* Thumbnai 생성
* @param fileName
* @param width
* @param height
* @throws Exception
*/
private static String createTumbnail(String path, String fileName, int width, int height ) throws Exception {
File source = new File(path +fileName);
BufferedImage originalImage = ImageIO.read(source);
// 원본 이미지의 너비와 높이
int ow = originalImage.getWidth();
int oh = originalImage.getHeight();
// 비율 조정
if( ow >= oh ) {
ow = oh;
} else {
oh = ow;
}
// 계산된 크기로 원본이미지를 가운데에서 crop
String[] thumbFile = fileName.split("\\.");
String thumbFileName = thumbFile[0] + "_" + width +"x"+ height + "." + thumbFile[1];
Thumbnails.of(source)
.sourceRegion(Positions.CENTER, ow, oh).size(width, height)
.toFiles(new File(path), new Rename() {
@Override
public String apply(String name, ThumbnailParameter param) {
return thumbFileName;
}
});
return thumbFileName;
}
- sourceRegin: 이미지를 잘라준다.
- prositions.center: 이미지의 가운데를 기점으로 자르겠다는 뜻, 가로폭, 세로폭
- size: 크기조정
- toFiles: 경로와 이름(새로운 이름으로 하기 위해 new name을 사용했고, 변하지 않게 하려면 Rename.NO_CHANGE를 쓰면 된다.
화면 결과
참고: https://nm-it-diary.tistory.com/66
[JAVA] 이미지 리사이즈, 썸네일 만들기 - Thumbnails.of
이미지 용량이 너무 크거나, 썸네일이 필요한 경우 사용할 수 있는 라이브러리 Thumbnails.of 사용 방법을 알아보려고 합니다. 1. import 라이브러리 import net.coobird.thumbnailator.Thumbnails; import net.coobird.thu
nm-it-diary.tistory.com
'Dev.BackEnd > Spring & Spring Boot' 카테고리의 다른 글
[스프링부트] 알림 기능(실시간 알림 받기) SSE사용 (feat lastEventId) (0) | 2023.10.07 |
---|---|
SpringBoot: @RequestParam vs @RequestBody이해하기 (0) | 2023.09.20 |
[스프링부트] Scheduled을 이용해 일정시간 또는 특정시간에 코드가 실행되게 해보자 (0) | 2023.08.25 |
[Spring boot] 웹페이지 tiles를 사용해서 간편하게 레이아웃 설정하기 (0) | 2023.08.24 |
Spring Boot 프로젝트 외부 경로 파일 접근하기 (0) | 2023.08.17 |