첨부하기 전에 해야할것
서버 - overview에 반드시 체크하기
root-contex.xml안에 넣기!
<bean id="multipartResolver
" class="org.springframework.web.multipart.commons.CommonsMultipartResolver
">
<property name="maxUploadSize" value="100000000"></property>
<property name="maxInMemorySize" value="100000000"></property>
</bean>
pom.xml안에 파일업로드 관련 설치하기
<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>
jsp파일부터 보자
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시글 작성</title>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<link href="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/summernote@0.8.18/dist/summernote.min.js"></script>
</head>
<body>
<h1 align="center">게시글 등록 페이지</h1>
<br>
<br>
<form action="/board/register.kh" method="post" enctype="multipart/form-data">
<table align="center" border="1">
<tr>
<td>제목</td>
<td><input type="text" name="boardTitle"></td>
</tr>
<tr>
<td>작성자</td>
<td><input type="text" name="boardWirter"></td>
</tr>
<tr>
<td>내용</td>
<td><textarea id="summernote" name="boardContents"
style="resize: none; width: 500px; height: 100%;"></textarea></td>
</tr>
<tr>
<td>첨부파일</td>
<td><input type="file" name="uploadFile"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="등록"> <input
type="reset" value="취소"></td>
</tr>
</table>
</form>
<script>
$('#summernote').summernote({
height : 300,
minHeight : null,
maxHeight : null,
focus : true,
});
$('[aria-label="Picture"]').css('display','none');
</script>
</body>
</html>
- 첨부파일 input태그에 name을 board의 변수명과 다르게했다
- form태그에
enctype="multipart/form-data"
를 추가했다, 이걸 추가해야 폼태그가 파일을 처리해준다
Controller에서 받은 파일을 처리하자
@RequestMapping(value="/board/register.kh", method = RequestMethod.POST)
public ModelAndView registBoard(ModelAndView mv,
@ModelAttribute Board board,
@RequestParam(value="uploadFile", required = false) MultipartFile uploadFile,
HttpServletRequest request
) {
try {
String boardFilename = uploadFile.getOriginalFilename();
if(!boardFilename.equals("")) {
String root= request.getSession().getServletContext().getRealPath("resources");
String savePath = root + "\\buploadFiles";
File file = new File(savePath);
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String boardRename = sdf.format(new Date(System.currentTimeMillis()))+"."+boardFilename.substring(boardFilename.lastIndexOf(".")+1);
if(!file.exists()) {
file.mkdir();
}
uploadFile.transferTo(new File(savePath+"\\"+boardRename));
board.setBoardFile(boardFilename);
String boardFilepath =savePath+"\\"+boardRename;
board.setBoardRename(boardRename);
board.setBoardFildpath(boardFilepath);
}
int result = bService.registerBoard(board);
mv.setViewName("redirect:/board/list.kh");
}catch (Exception e) {
e.printStackTrace();
mv.addObject("mgs",e.getMessage());
mv.setViewName("/common/errorPage");
}
return mv;
}
- 메소드에 매개변수가 파일을 처리할수 있도록 추가되었다.
public ModelAndView registBoard(ModelAndView mv,
@ModelAttribute Board board,
@RequestParam(value="uploadFile", required = false) MultipartFile uploadFile,
HttpServletRequest request
)
- input type file에 name uploadFile을 RequestParam을 통해 가져오고 MultipartFile uploadFile로 선언해준다
- required = false 를 선언하여 값이 null일수도 있음을 설정한다
- HttpServletRequest를 선언해 가지고 온다.
String boardFilename = uploadFile.getOriginalFilename();
if(!boardFilename.equals("")) {
- uploadFile의 null은 “”으로 인식된다.
- uploadFile.getOriginalFilename()을 이용해 파일의 이름을 boadFilename에 저장한다
String root= request.getSession().getServletContext().getRealPath("resources");
String savePath = root + "\\buploadFiles";
File file = new File(savePath);
- 파일을 저장할 root를 만든다.
request.getSession().getServletContext().getRealPath("resources");
: 지금 서버에 resources폴더가 있는 경로를 찾는다.
- savePath에서 방금 설정한 루트에 buploadFile 폴더를 만들어 저장하겠다는 경로를 설정한다.
- File객체를 이용해 savePath에 저장한 경로에 file을 저장한다고 선언한다.
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
String boardRename = sdf.format(new Date(System.currentTimeMillis()))+"."+boardFilename.substring(boardFilename.lastIndexOf(".")+1);
- 이대로 저장하면 같은 이름의 파일을 올렸을때는 파일이 겹쳐진다, 새로운 이름을 부여하기 위해 simplDateFormat을 화용하여 현재 날짜 시간 초를 파일이름으로 정해 파일이름이 겹치지 않게한다.
boardFilename.substring(boardFilename.lastIndexOf(".")+1);
- 내가 올린 파일의 확장자를 찾는다.
- boardFilename에 저장된 업로드 파일의 이름을 subString을 이용해 (.)을 기준으로 index+1한 값으로 구분한다 (.뒤에 붙음 텍스트가 확장자 이름이니까)
- sdf에 선언한 현재 년월일시분초.확장자가 새로운 이름이 된다.
if(!file.exists()) { file.mkdir(); }
지정한 경로가 없다면 file.mkdir()을 통해 경로에 맞는 폴드를 생성한다.
uploadFile.transferTo(new File(savePath+"\\"+boardRename));
board.setBoardFile(boardFilename);
String boardFilepath =savePath+"\\"+boardRename;
board.setBoardRename(boardRename);
board.setBoardFildpath(boardFilepath);
- board클래스에 변수에 지금 저장한 파일의 이름, 파일의 경로, 새롭게 정한 이름, 파일의 경로등을 저장하여 이 변수를 포함한 board를 service와 store에 전달한다
- 나머지 과정은 https://velog.io/@hana78786/60.-스프링으로-게시물-등록하기와 같다
- 정상적으로 끝냈다면 이제 board_tbl에는 업로드한 파일 경로와 이름, 바꾼이름 등이 컬럼에 저장되었으며
- 설정한 경로에 업로드한 파일이 등록되어을 것이다.