오늘 지인분이 스프링에서 특정경로
+ yyyy/MM/dd
와 같은 Path 구조에 파일을 간단히 upload 하는 방법을 여쭤보셔서 답해드렸다.
구현하기 간단한 것 같으면서도 막상 구현하려니 머리에 바로 떠오르지가 않던 코드여서 공유 차원에서 글을 포스트해본다.
- 스프링 5.1 이상
- JDK 7 이상
- 라이브러리 : [ Spring web ]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>업로드 테스트</title>
</head>
<body>
<h1>업로드 테스트</h1>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="file" >
<button type="submit" value="보내기">Submit</button>
</form>
</body>
</html>
@Controller
public class UploadController {
@GetMapping
public String indexPage(){
return "index.html";
}
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@ResponseBody
public ResponseEntity<Object> uploadFile(MultipartFile file) throws IOException {
Path targetFile = FileUtils.saveFile(file); // 파일을 FileUtils 클래스에 전달
return ResponseEntity.ok(targetFile.toAbsolutePath()); // 경로 결과 전달
}
}
public class FileUtils {
private static final String FORMAT_YYYYMMDD = "yyyy/MM/dd"; // 1)
private static final DateTimeFormatter dtf = DateTimeFormatter.ofPattern(FORMAT_YYYYMMDD);
public static Path getPathToday() throws IOException {
String basePath = "C:/files";
String todayPath = LocalDateTime.now().format(dtf); // 2)
Path pathToday = Paths.get(basePath, todayPath); // 3)
if (Files.notExists(pathToday)) { // 4)
Files.createDirectories(pathToday);
}
return pathToday;
}
public static Path getPathToday(String fileName) throws IOException {
return Paths.get(getPathToday().toString(), fileName); // 5)
}
public static Path saveFile(MultipartFile multipartFile) throws IOException {
Path targetPath = getPathToday(multipartFile.getOriginalFilename()); // 6)
multipartFile.transferTo(targetPath); // 7)
return targetPath;
}
}
1) 연 / 월 / 일 로 경로를 맞추기 위한 포맷 선언
2) DateTimeFormatter 를 이용하여 현재 날짜를 포맷에 맞게 파싱해준다. ex) 2021/06/25
3) BasePath 와 현재 날짜를 합친 Path 객체 생성
4) 폴더가 없을 경우 생성해준다.
5) BasePath + 날짜 + 파일명(확장자 포함) 을 합친 Path 객체 생성
6) Client 에서 받은 multipart 로 부터 파일명+확장자를 넘겨주어 최종 Path 객체를 반환
7) file 을 outputStream 으로 내보내준다 (save)
막상 구현한 코드를 보면 정말 간단한데 처음에 코드를 짤 때 생각보다 오래 걸렸던 것 같다.. 그동안 나태했던 나 자신을 돌이켜보는(?) 시간이기도 했으며 이러한 기회를 제공해주신 KMS
님께 감사하다는 말을 전하고 싶다.