[스프링] MultipartFile 오늘 날짜 경로에 upload 하기

최대한·2021년 6월 24일
0
post-custom-banner

개요

오늘 지인분이 스프링에서 특정경로 + yyyy/MM/dd 와 같은 Path 구조에 파일을 간단히 upload 하는 방법을 여쭤보셔서 답해드렸다.
구현하기 간단한 것 같으면서도 막상 구현하려니 머리에 바로 떠오르지가 않던 코드여서 공유 차원에서 글을 포스트해본다.

>> 요구 스택

  • 스프링 5.1 이상
  • JDK 7 이상
  • 라이브러리 : [ Spring web ]

1. /src/main/resources/static/index.html

<!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>

2. UploadController.java

@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());	// 경로 결과 전달
    }

}

3. FileUtils.java

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 님께 감사하다는 말을 전하고 싶다.

profile
Awesome Dev!
post-custom-banner

0개의 댓글