1. 파일첨부를 위한 라이브러리 등록
- pom.xml에 dependency태그 작성 commons-fileupload / commons-fileupload
<!-- 파일 업로드를 위한 라이브러리 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
2. 파일 첨부를 위한 객체 bean등록
- root-context.xml에 id속성으로 multipartResolver 객체 등록
<!-- 파일 업로드 관련 빈 등록 -->
<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver">
<property name="maxUploadSize" value="100000000" />
<property name="maxInMemorySize" value="100000000" />
</bean>
> maxUploadSize : 첨부파일 용량 제한
> maxInMemorySize : 디스크에 임시 파일을 생성하기 전에 메모리에 보관할수있는 최대 바이트크기
- MultipartFile 객체를 넘겨받음
// 게시글 작성
@RequestMapping("insert.bo") // 첨부파일이 여러개라면? MutipartFile[] upfile (배열로 받을 수 있음)
public String insertBoard(Board b, MultipartFile upfile, HttpSession session, Model model) {
// System.out.println(b);
// System.out.println(upfile); 첨부파일이 선택O / 선택X 객체가 무조건 생성! (차이점은 filename에 원본명이 존재하는가, ""빈문자열 인가)
// 전달된 파일이 있을 경우 => 파일명 수정 작업 후 서버 업로드
// => 원본명, 서버에 업로드된 경로를 b에 이어서 담기(파일이 존재할 경우에만)
// 케이스가 나뉨!
// 넘어온 첨부파일이 없을 경우 b : 제목, 작성자, 내용
// 넘어온 첨부파일이 있을 경우 b : 제목, 작성자, 내용 + 파일 원본명, 파일저장경로
if (!upfile.getOriginalFilename().equals("")) { // getOriginalFileName == filename 필드의 값을 반환
b.setOriginName(upfile.getOriginalFilename());
b.setChangeName("resources/uploadFiles/" + saveFile(upfile, session));
// 실제적인 작업은 메소드 호출을 통해 이루어짐
}
if(boardService.insertBoard(b) > 0) { // 성공 => 게시글 리스트 페이지
// 포워딩 => boardListView.jsp / list 조회 불가능!!
session.setAttribute("alertMsg", "게시글이 등록되었습니다.");
return "redirect:list.bo";
} else { // 실패 => 에러페이지
model.addAttribute("errorMsg", "게시글 작성 실패");
return "common/errorPage";
}
}
3. 서버에 이름을 바꾼 파일을 저장하고, 바꾼 이름을 반환하는 메소드 생성
// 실제 넘어온 파일의 이름을 변경해서 서버에 업로드
public String saveFile(MultipartFile upfile, HttpSession session) {
// 파일명 수정 작업 후 서버에 업로드 시키기("image.png" => 20221238123123.png)
String originName = upfile.getOriginalFilename();
// "20221226104530"(년월일시분초)
String currentTime = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
// 12321 (5자리 랜덤값)
int ranNum = (int)(Math.random() * 90000 + 10000);
// 확장자
String ext = originName.substring(originName.lastIndexOf("."));
// 변경된 파일명
String changeName = currentTime + ranNum + ext;
// 업로드 시키고자 하는 폴더의 물리적인 경로 알아내기
String savePath = session.getServletContext().getRealPath("/resources/uploadFiles/");
try {
// transferTo : 실제로 파일을 서버에 업로드해주는 메소드
upfile.transferTo(new File(savePath + changeName));
} catch (IOException e) { // 컴파일러가 체크 : checkedException
e.printStackTrace();
}
return changeName;
}
'개발 > Framework' 카테고리의 다른 글
[MyBatis] ResultMap에서 collection 사용 (3) | 2023.03.22 |
---|---|
[Spring] 스프링에서 AJAX 응답데이터 보내기 (JSON, GSON 사용) / @ResponseBody (0) | 2022.12.27 |
[Spring] Spring Legacy Project 디렉토리 구조 (+ 추가 중) (0) | 2022.12.26 |
[Spring] 메이븐(Maven) 개념 / 사용법 (1) | 2022.12.25 |
[MyBatis] MyBatis 동적 SQL 처리 (0) | 2022.12.19 |