[Spring] 20. 게시물 파일 업로드 기초 MVC 구성개발자가 되기까지 (2023.08.16~2024.04.15)/[Spring] Basic Web2024. 1. 20. 23:00
Table of Contents
sql
-- 2024-01-19
CREATE TABLE file(
uuid VARCHAR(256) NOT NULL,
save_dir VARCHAR(256) NOT NULL,
file_name VARCHAR(256) NOT NULL,
file_type TINYINT(1) DEFAULT 0,
bno BIGINT,
file_size BIGINT,
reg_at DATETIME DEFAULT now(),
PRIMARY KEY(uuid)
);
FileVO.java
package com.basicWeb.www.domain;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Setter
@Getter
public class FileVO {
private String uuid;
private String saveDir;
private String fileName;
private String fileType;
private long bno;
private long fileSize;
private String regAt;
}
BoardDTO.java
package com.basicWeb.www.domain;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@AllArgsConstructor
@NoArgsConstructor
@Setter
@Getter
public class BoardDTO {
private BoardVO bvo;
private List<FileVO> flist;
}
FileHandler.java
package com.basicWeb.www.handler;
import java.io.File;
import java.io.IOException;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import org.apache.tika.Tika;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import com.basicWeb.www.domain.FileVO;
import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;
@Slf4j
@Component // 사용자 class를 bean으로 등록
public class FileHandler {
private final String UP_DIR = "파일 저장 경로";
public List<FileVO> uploadFiles(MultipartFile[] files) {
List<FileVO> flist = new ArrayList<>();
LocalDate date = LocalDate.now();
String today = date.toString(); // year-month-day
today = today.replace("-", File.separator);
File folders = new File(UP_DIR, today);
// mkdirs() : 여러개의 폴더를 동시에 생성
// mkdir() : 하나의 폴더만 생성
if(!folders.exists()) {
folders.mkdirs();
}
for(MultipartFile file : files) {
FileVO fvo = new FileVO();
fvo.setSaveDir(today);
fvo.setFileSize(file.getSize());
String originalFileName = file.getOriginalFilename();
String fileName = originalFileName.substring(originalFileName.lastIndexOf(File.separator)+1);
fvo.setFileName(fileName);
UUID uuid = UUID.randomUUID();
String uuidstr = uuid.toString();
fvo.setUuid(uuidstr);
String fullFileName = uuidstr + "_" + fileName;
File storeFile = new File(folders, fullFileName);
try {
file.transferTo(storeFile);
if(isImageFile(storeFile)) {
fvo.setFileType(1);
File thumbNail = new File(folders, uuidstr + "_" + fileName);
Thumbnails.of(storeFile).size(75, 75).toFile(thumbNail);
}
} catch (Exception e) {
e.printStackTrace();
log.info("파일 생성 오류");
}
flist.add(fvo);
}
return flist;
}
private boolean isImageFile(File storeFile) throws IOException {
String mimeType = new Tika().detect(storeFile);
return mimeType.startsWith("image") ? true : false;
}
}
@Component는 class를 Bean으로 등록하기 위해서 사용하는 어노테이션이다.
더 쉽게 표현하자면 필요할 때 자동으로 그 class를 사용하겠다는 의미이다.
uploadFiles() Method
File.separator는 윈도우에서는 역슬래시(\)이며, 유닉스 및 리눅스 시스템에서는 슬래시(/) 이다.
그러므로 File.separator를 쓰는 이유는 년-월-일을 년/월/일로 바꾸어
날짜별로 폴더를 생성해 파일들을 저장하여 관리하기 위함이다.
uuid는 고유한 식별자(UUID)를 의미한다.
isImageFile() Method
mimeType는 파일의 종류를 나타내는 정보이며, image 파일인지 판단하기 위한 Method
[Spring] 20. 게시물 파일 업로드 기초 MVC 구성
(다음 게시물 예고편)
[Spring] 21. 게시물 등록 - 파일 업로드 기능 추가
728x90
@rlozlr :: 얼렁뚱땅 개발자
얼렁뚱땅 주니어 개발자
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!