63. 스프링으로 첨부파일 올리기

hanahana·2022년 9월 8일
0

Spring 학원수강

목록 보기
15/45
post-thumbnail

첨부하기 전에 해야할것

서버 - overview에 반드시 체크하기

root-contex.xml안에 넣기!

<!-- 	파일 업로드 관련 빈 등록 MultipartResolver 오타조심!!!-->	

	<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안에 파일업로드 관련 설치하기

		<!--dependencies안에 넣을것-->

<!-- 파일 업로드 관련 라이브러리 -->
		<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
		<dependency>
			<groupId>commons-fileupload</groupId>
			<artifactId>commons-fileupload</artifactId>
			<version>1.3.3</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
		<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>
<!-- include libraries(jQuery, bootstrap) -->
<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>

<!-- include summernote css/js -->
<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>
	
	
	<!-- enctype을 이용해 파일을 전송한다 오타조심!!!!-->
	<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, // set editor height
			minHeight : null, // set minimum height of editor
			maxHeight : null, // set maximum height of editor
			focus : true, // set focus to editable area after initializing summernote

		});
		$('[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,
//requiered로 필수값 아닌것 표시 MultipartFile이 파일을 업로드 해주는 객체
			HttpServletRequest request
			) {
		
		
		try {
			
			
			String boardFilename = uploadFile.getOriginalFilename();
			if(!boardFilename.equals("")) {
				//만약requestParam으로 저장한 uploadfile이 비어있지 않다면
					
			
			String root= request.getSession().getServletContext().getRealPath("resources");
			String savePath = root + "\\buploadFiles"; //내가 저장할 폴더
			File file = new File(savePath); // 파일 객체 만들기
			
			//파일 이름으로 업로드하면 파일이름이 겹치면 파일이 겹쳐서 사라진다.
			//고유한 rename으로 변경해주어야 한다.
			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
			String boardRename = sdf.format(new Date(System.currentTimeMillis()))+"."+boardFilename.substring(boardFilename.lastIndexOf(".")+1);
			
			if(!file.exists()) { //경로에 savePath가 없을땐
				file.mkdir(); //경로 만들기
			}
			
			uploadFile.transferTo(new File(savePath+"\\"+boardRename));//파일을 buploadFile경로에 저장
			
			
			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,
//requiered로 필수값 아닌것 표시 MultipartFile이 파일을 업로드 해주는 객체
			HttpServletRequest request
			)
  • input type file에 name uploadFile을 RequestParam을 통해 가져오고 MultipartFile uploadFile로 선언해준다
  • required = false 를 선언하여 값이 null일수도 있음을 설정한다
  • HttpServletRequest를 선언해 가지고 온다.
		String boardFilename = uploadFile.getOriginalFilename();
			if(!boardFilename.equals("")) {
				//만약requestParam으로 저장한 uploadfile이 비어있지 않다면
					
  • 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));
    • 파일을 buploadFile경로에 저장
			board.setBoardFile(boardFilename);
			
			String boardFilepath =savePath+"\\"+boardRename;
			
			
			board.setBoardRename(boardRename);
			board.setBoardFildpath(boardFilepath);
  • board클래스에 변수에 지금 저장한 파일의 이름, 파일의 경로, 새롭게 정한 이름, 파일의 경로등을 저장하여 이 변수를 포함한 board를 service와 store에 전달한다
  • 나머지 과정은 https://velog.io/@hana78786/60.-스프링으로-게시물-등록하기와 같다
  • 정상적으로 끝냈다면 이제 board_tbl에는 업로드한 파일 경로와 이름, 바꾼이름 등이 컬럼에 저장되었으며
  • 설정한 경로에 업로드한 파일이 등록되어을 것이다.
profile
hello world

0개의 댓글