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());
}
}
반응형
'JAVA - SPRING' 카테고리의 다른 글
[Spring Boot] 스프링 인터셉터 | Spring Interceptor란? (0) | 2022.12.27 |
---|---|
[Java] 세션과 쿠키 | 클라이언트와 서버 | WAS Servlet이란? (0) | 2022.12.25 |
[MyBatis / Spring] TooManyResultsException 오류 해결방법 (0) | 2022.11.21 |
[Spring Boot] 윈도우 h2 console , bat 실행 안됨 해결법 (0) | 2022.11.16 |
[Spring Boot | IntelliJ] Gradle 배포하기 (0) | 2022.11.14 |