파일 업로드 시 이미지 파일을 DB에 저장하면 절대 안 되기 때문에
작업경로에 폴더를 만들어 그쪽에 저장되도록 해야한다!
application.properties
폴더 이름 생성
org.aaaa.upload.path=upload
CustomFileUtil
파일 업로드 시 공통으로 사용할 CustomFileUtil 클래스 생성
@Component 어노테이션 주입
1. 파일경로 생성
@Value("${org.aaaa.upload.path}")
private String uploadPath;
@Value에 경로 주입
2. 초기화 메소드 생성
파일을 저장할 폴더 생성
@PostConstruct
public void init(){
File tempFolder = new File(uploadPath);
if(!tempFolder.exists()){ //폴더가 존재하지 않는다면
tempFolder.mkdir(); //디렉토리로 만들어줘
}
uploadPath = tempFolder.getAbsolutePath();
log.info("--------------------");
log.info(uploadPath);
}
@PostConstruct
- 의존성 주입이 완료된 후에 실행되어야 하는 method에 사용
- 해당 어노테이션은 다른 리소스에서 호출되지 않아도 수행
- 생성자 보다 늦게 호출된다.
[호출 순서]
1. 생성자 호출
2. 의존성 주입 완료 (@Autowired || @RequiredArgsConstructor )
3. @PostConstruct
3. saveFile 메소드 생성
public List<String> saveFiles(List<MultipartFile> files) throws RuntimeException{
if(files == null || files.size() == 0){
return null;
}
// 업로드할 파일이 없을 경우
List<String> uploadNames = new ArrayList<>();
//파일 여러개 받아올거기 때문에 List로 받아오기
// for문 돌면서 파일처리
for(MultipartFile file : files){
//동일한 파일이름 예외처리를 위해 uuid
String savedName = UUID.randomUUID().toString()+"_"+ file.getOriginalFilename();
//저장을 위해 만드는 경로
Path savePath = Paths.get(uploadPath, savedName);
try {
// 원본파일 업로드
Files.copy(file.getInputStream(), savePath);
uploadNames.add(savedName);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
return uploadNames;
}
ProductDto생성
업로드하려고 하는 곳에 dto생성
// 업로드 처리가 필요한 파일
@Builder.Default
private List<MultipartFile> files = new ArrayList<>();
// 이미 업로드 된 파일들의 이름
@Builder.Default
private List<String> uploadedFileName = new ArrayList<>();
ProductController생성
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/products")
public class ProductController {
private final CustomFileUtil fileUtil;
@PostMapping("/")
public Map<String, String> register(ProductDto productDto){
List<MultipartFile> files = productDto.getFiles();
List<String> uplodedFileName = fileUtil.saveFiles(files);
productDto.setUploadedFileName(uplodedFileName);
return Map.of("RESULT","SUCCESS");
}
}
+ 썸네일 만들기
원본으로만 저장될 경우 너무 큰 사이즈가 업로드될 수 있기 때문에 썸네일 이미지도 만들어 주려고 한다!
1. CustomFileUtil saveFile 메소드
코드 추가해 주기 - 이미지인 경우에만 썸네일을 만들어준다
try {
// 원본파일 업로드
Files.copy(file.getInputStream(), savePath);
String contentType = file.getContentType(); //Mime Type
// 썸네일 만들기 - 이미지 인 경우
if(contentType != null && contentType.startsWith("image")){
Path thumbnailPath = Paths.get(uploadPath, "s_" + savedName);
Thumbnails.of(savePath.toFile()).size(200,200).toFile(thumbnailPath.toFile());
}
uploadNames.add(savedName);
} catch (IOException e) {
throw new RuntimeException(e);
}
2. Postman으로 확인하기
Post선택 - form-data선택 - file (File선택) - 이미지 선택
원본이미지 + 썸네일 이미지 만들기 성공!
'Spring Boot' 카테고리의 다른 글
[Spring Boot] 연관관계 매핑 (@ManyToOne, @OneToMany, @ManyToMany, @OneToOne) (0) | 2024.06.28 |
---|---|
[Spring Boot] QueryDSL이란? (1) | 2024.05.22 |
[Spring Boot] @RestControllerAdvice를 이용한 Spring 예외처리 (0) | 2024.05.21 |
[Spring Boot] @Component 어노테이션 (0) | 2024.05.20 |
[Spring Boot] @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor (0) | 2024.05.15 |