JAVA - SPRING

[Java] File Upload 파일명 현재시간으로 업로드 시키기

엘라 ELLA 2022. 12. 8. 15:03
728x90
반응형

파일 등록하는 Controller 전문

@ResponseBody
    @PostMapping("/upload/api")
    public void uploadFiles(MultipartFile[] uploadFile) {
        log.info("update ajax post . . . ");
		
        //현재시간 서울에 맞춰 불러오기
        ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Asia/Seoul"));
        //현재시간 데이터 형식 지정해주기
        DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss");

        //업로드 할 폴더 지정
        String uploadFolder = "C:\\upload\\";

        //새폴더 생성
        File dir = new File(uploadFolder);

        if (!dir.exists() || !dir.isDirectory()) {
            dir.mkdirs();
        }

        for (MultipartFile multipartFile : uploadFile) {
            log.info("----------------");
            log.info("Upload date : " + now.format(format));
            log.info("Upload File Name : " + multipartFile.getOriginalFilename());
            log.info("Upload File Size : " + multipartFile.getSize());


            //업로드 할 파일의 이름(사용자가 등록한 파일의 이름)
            String userFileName = multipartFile.getOriginalFilename();

            //확장자명 구하기
            String fileExtension = "";
            fileExtension = userFileName.substring(userFileName.lastIndexOf(".") + 1);
            log.info("extension : ." + fileExtension);

            //yyyyMMdd_HHmmss 형식의 새 이름 붙혀주기
            String uploadFileName = "";
            uploadFileName = now.format(format) + "." + fileExtension;
            log.info("only file name : " + uploadFileName);

            //파일 저장
            File fileRename = new File(uploadFolder, uploadFileName);
            File saveFile = new File(uploadFolder, multipartFile.getOriginalFilename());

            boolean success = saveFile.renameTo(fileRename);
            if (success) {
                System.out.println("File successfully renamed");
            } else {
                System.out.println("File renamed fail");
            }

            log.info("upload new file name : " + saveFile);

            try {
                multipartFile.transferTo(saveFile);
            } catch (Exception e) {
                e.printStackTrace();
                log.error(e.getMessage());
            }
        }
    }

 

코드분석

ZoneDateTime으로 서울의 현재시간을 불러와서 원하는 형식으로 지정해줍니다.

20221208_150000 형식으로 이름이 지어졌으면 해서 아래와 같이 포맷도 지정 해주었습니다.

 

그 밑에 업로드 할 폴더도 지정해줬습니다.

ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Asia/Seoul"));
DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss");

//업로드 할 폴더 지정
String uploadFolder = "C:\\upload\\";

 

새폴더가 없을 수 도 있으므로 해당 이름의 폴더가 없으면 새폴더를 만들어서 저장하도록 해줍니다.

 //새폴더 생성
        File dir = new File(uploadFolder);

        if (!dir.exists() || !dir.isDirectory()) {
            dir.mkdirs(); // C:/a/b/c/d/e/f/g/
//            dir.mkdir(); // C:/a/b/c/d/e/f
        }

 

log.info를 이용해서 업로드 시간, 파일명, 파일사이즈, 확장자 등을 계속 체크 할 수 있도록 중간에 추가해줍니다.

 

그리고 userFileName에 사용자가 등록한 파일의 이름을 가지고와줍니다.

for (MultipartFile multipartFile : uploadFile) {
    log.info("----------------");
    log.info("Upload date : " + now.format(format));
    log.info("Upload File Name : " + multipartFile.getOriginalFilename());
    log.info("Upload File Size : " + multipartFile.getSize());

    //업로드 할 파일의 이름(사용자가 등록한 파일의 이름)
    String userFileName = multipartFile.getOriginalFilename();

 

업로드 한 확장자 파일 명 구하기

fileExtension에 빈 값을 넣어주고 확장자명을 채워넣어줍니다. 이렇게 하면 "."이 없는 txt 혹은 hwp 등의 확장자명이 나옵니다. 

//확장자명 구하기
String fileExtension = "";
fileExtension = userFileName.substring(userFileName.lastIndexOf(".") + 1);
log.info("extension : ." + fileExtension);

 

원하는 새로운 형식의 이름을 정의해니다.

//yyyyMMdd_HHmmss 형식의 새 이름 붙혀주기
String uploadFileName = "";
uploadFileName = now.format(format) + "." + fileExtension;
log.info("only file name : " + uploadFileName);

renameTo()메서드를 이용해서 파일의 이름을 원하는 형식으로 재지정 해줍니다.

이 때, renameTo()는 오류가 많다고 하니 sucess라는 불린을 추가 해서 성공적으로 바뀌었는지를 확인해줍니다.

File fileRename = new File(uploadFolder, uploadFileName);
File saveFile = new File(uploadFolder, multipartFile.getOriginalFilename());

boolean success = saveFile.renameTo(fileRename);
if (success) {
    System.out.println("File successfully renamed");
} else {
    System.out.println("File renamed fail");
}

 

근데 위의 한 블럭을 한줄로 줄일 수 있습니다.

fileRename이라는 새로운 File을 통하지 않고, 위에서 구한 내가 원하는 형식을 파일 이름부분에 집어 넣어주면 됩니다.

File saveFile = new File(uploadFolder, uploadFileName);

최종 개선된 블럭

    @ResponseBody
    @PostMapping("/upload/api")
    public void uploadFiles(MultipartFile[] uploadFile) {
        log.info("update ajax post . . . ");

        ZonedDateTime now = ZonedDateTime.now(ZoneId.of("Asia/Seoul"));
        DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss");

        String uploadFolder = "C:\\upload\\";

        File dir = new File(uploadFolder);

        if (!dir.exists() || !dir.isDirectory()) {
            dir.mkdirs();
        }

        for (MultipartFile multipartFile : uploadFile) {
            log.info("----------------");
            log.info("Upload date : " + now.format(format));
            log.info("Upload File Name : " + multipartFile.getOriginalFilename());
            log.info("Upload File Size : " + multipartFile.getSize());

            String userFileName = multipartFile.getOriginalFilename();

            String fileExtension = "";
            fileExtension = userFileName.substring(userFileName.lastIndexOf(".") + 1);
            log.info("extension : ." + fileExtension);

            String uploadFileName = "";
            uploadFileName = now.format(format) + "." + fileExtension;
            log.info("only file name : " + uploadFileName);

            File saveFile = new File(uploadFolder, uploadFileName);

            try {
                multipartFile.transferTo(saveFile);
            } catch (Exception e) {
                e.printStackTrace();
                log.error(e.getMessage());
            }
        }
반응형