파일을 업로드 할 때에는 기본 파일명, 확장자, 새로운 파일명이 필수로 필요하다.
하지만 연결하는 DB는 다를 수 있기 때문에 변환하는 내용만 공통 기능으로 작성해두었다.
public static List<FileDTO> uploadFiles(MultipartFile[] files){
if(files == null || files.length == 0) {
throw new IllegalArgumentException("업로드된 파일이 없습니다.");
}
List<FileDTO> results = new ArrayList<FileDTO>();
for (MultipartFile file : files) {
String ori_filename = file.getOriginalFilename();
String type = ori_filename.substring(ori_filename.lastIndexOf("."));
String new_filename = UUID.randomUUID().toString() + type;
try {
Path path = Paths.get("C:/upload/", new_filename);
Files.write(path, file.getBytes());
results.add(new FileDTO(ori_filename, new_filename, type));
} catch (IOException e) {
throw new RuntimeException("파일 저장 중 오류 발생: " + new_filename, e);
}
}
return results;
}
이후 값을 받아 그대로 사용하거나 추가 데이터가 있을 경우 값을 추가해 사용해주면 된다.
사용 예시
controller
@PostMapping(value="/fileWrite")
public ResponseEntity<ResponseDTO<List<FileDTO>>> uploadFiles(@RequestParam("files") MultipartFile[] files) {
try {
// 1. 서비스 호출
ResponseDTO<List<FileDTO>> response = service.saveFiles(files);
// 2. 성공 응답 반환
return ResponseEntity.ok(response);
} catch (Exception e) {
// 3. 에러 발생 시 실패 응답 반환
ResponseDTO<List<FileDTO>> errorResponse = new ResponseDTO<>(500, "파일 업로드 중 오류 발생: " + e.getMessage(), null);
return ResponseEntity.status(500).body(errorResponse);
}
}
service
public ResponseDTO<List<FileDTO>> saveFiles(MultipartFile[] files) {
// 1. 유틸리티 클래스에서 파일 리스트 생성
List<FileDTO> fileDtos = CommonUtil.uploadFiles(files);
// 2. DB 저장
int insertedRows = testDao.fileWrite(fileDtos);
if (insertedRows != fileDtos.size()) {
throw new RuntimeException("일부 파일 저장 실패");
}
// 3. 성공 응답 생성
return new ResponseDTO<>(200, "파일 업로드 성공", fileDtos);
}
mapper
<insert id="fileWrite" parameterType="list">
INSERT INTO filetest (ori_filename, new_filename, type)
VALUES
<foreach collection="list" item="file" separator=",">
(#{file.ori_filename}, #{file.new_filename}, #{file.type})
</foreach>
</insert>
여러개의 값이 들어올 수 있기 때문에 foreach를 사용해준다.
❗ 여러개의 값이 들어올 경우 어떻게 처리해야 하는지를 고민하다가
쿼리문을 반복해서 넣어주는 것으로 결정했다!
이렇게 공통 코드를 줄이고 추후 개발에 사용할 수 있는 파일 업로드 기능을 개발해보았다!