[ITWILL : JSP]Javabean 11 : MultipartRequest클래스

ITWILL학원 : 31강 JSP기초 BY 정규태강사

  • MultipartRequest클래스 (p305)
    MultipartRequest 클래스의 생성자와 메소드들을 사용하여 파일 업로드 기능 구현

https://slidesplayer.org/slide/14223134/
https://slidesplayer.org/slide/14223134/
https://slidesplayer.org/slide/14223134/

1. 라이브러리 설치

  1. servlets페이지 방문.
  2. 왼쪽 카테고리 COS File Upload Library 클릭 하여 com.oreilly.servlet로 이동.
  3. 맨 하단에 Download 에서 Version 밑에 zip압축파일 다운로드.
  4. lib폴더 안의 cos.jar복사하여 프로젝트의 WebContent\WEB-INF\lib에 붙여넣기.

2. fwriteForm.jsp 작성

  1. cos.jar라이브러리설치 (위에 내용 참고)
  2. 폼태그속성 enctype=”multipart/form-data”, method=”post”
  3. D드라이브에 `upfile’ 폴더생성
    • D드라이브말고 원하는 경로 지정가능.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<%
String id = (String) session.getAttribute("id");
if( id == null){
%>
<script type="text/javascript">
alert("로그인 후 이용가능합니다");
location.href="../member/loginForm.jsp"
</script>
<%
}

//1. cos.jar라이브러리설치 (위에 내용 참고)
//2. 폼태그속성 enctype="multipart/form-data", method="post" get방식은 처리되지 않음.
//3. D드라이브에 `upfile' 폴더생성- D드라이브말고 원하는 경로 지정가능.
%>

<fieldset>
<legend>게시판 글쓰기(p305~)</legend>
<form action="fwritePro.jsp" method="post" enctype="multipart/form-data">
글쓴이 : <input type="text" name="name" required><br>
비밀번호 : <input type="password" name="pw" required><br>
제목 : <input type="text" name="subject" maxlength="15" required><br>
내용 : <br>
<textarea rows="10" cols="35" name="content" placeholder="여기에 작성해주세요" required></textarea><br>
파일 : <input type="file" name="file">
<input type="submit" value="글등록" class="btn">
<button type="reset" class="btn">초기화</button>
<input type="button" value="목록으로" class="btn" onclick="location.href='boardList.jsp'">
</form>
</fieldset>

3. fwritePro.jsp 작성

파일업로드구현

  1. 파일 업로드 => cos.jar (MultipartRequest 클래스)
  2. 파일이 저장되는 위치 (D:/upfile)
  3. 파일 업로드 최대 크기
    • 크기를 왜 지정해야할까? 그 전에 파일을 업로드하면 어디로 저장되는지 알아야한다
    • 서버의 upfile폴더안으로 들어간다.
    • 따라서 유한한 디스크이고 메모리라서 최대 크기 지정이 필수이다.
    • 보통 20~250MB이다.
    • 1MB = 1024바이트 * 1024바이트 계산 꼭 하기
  4. MultipartRequest생성 : import하기 (다운받았던 cos.jar라이브러리)
    • 아래 코드처럼 객채생성하면 에러메세지가 뜬다
      1
      MultipartRequest multi = new MultipartRequest();
    • The constructor MultipartRequest() is undefined 기본생성자가 없는 클래스이다
    • 따라서 아래처럼 괄호안에 오버로딩되는 생성자를 작성해야한다.
    • MultipartRequest(요청정보,파일 업로드할 폴더,파일 업로드 제한 크기,인코딩방식,파일 이름동일시 처리객체)
      1
      MultipartRequest multi = new MultipartRequest(request, savePath, maxSize, "UTF-8", new DefaultFileRenamePolicy());
    • new DefaultFileRenamePolicy 객체의 역할 : 우리가 동일한 파일을 다운로드받는 경우 파일명에 파일명(1), 파일명(2)등등 자동으로 구분할 수 있도록 rename해주는 역할을 한다. 즉 중복처리하는 객체.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%
//파일 업로드 => cos.jar (MultipartRequest 클래스)
//1. 파일이 저장되는 위치 (D:/upfile)
String savePath = "d:\\upfile";

//2. 파일 업로드 최대 크기 => 5MB
int maxSize = 5 * 1024 * 1024;

//3. MultipartRequest 객체생성
MultipartRequest multi = new MultipartRequest(request, savePath, maxSize,"UTF-8", new DefaultFileRenamePolicy());

//4. 파일 업로드 완료 확인
out.println("파일 업로드 완료!");
%>
  • 테스트하면 만들었던 upfile폴더안에 저장되어있다. 성!공!적!
  • 하지만 이 방법은 보안상 매우 위험하다
    • 누구나 주소를 입력하여 upfile폴더에 접근가능하기때문이다.
    • 이제 디비와 연결해보자.

4. 디비연결

위의 코드에서 아래 코드를 더 추가해야한다.

  • multi객체 안에 request가 있으므로 request.getParameter()가 아닌 multi.getParameter()로 가지고 와야한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
//6. 파일의 정보 + 글 정보를 디비에 저장
//6-1. 글정보저장하는 객체생성
BoardBean bb = new BoardBean();
//6-2. 전달되는 정보 저장
// bb.setName(request.getParameter("name")); enctype과 함께 쓸 수없다
bb.setName(multi.getParameter("name"));
bb.setPw(multi.getParameter("pw"));
bb.setSubject(multi.getParameter("subject"));
bb.setContent(multi.getParameter("content"));

// bb.setFile(multi.getParameter("file")); //DB에 파일저장 불가->아래코드로 진행
bb.setFile(multi.getFilesystemName("file"));
System.out.println("upfile에 저장된 파일명 : "+multi.getFilesystemName("file"));
System.out.println("사용자가 올린 원본 파일명 : "+multi.getOriginalFileName("file"));

//6-3. 따로 저장한 정보 저장
bb.setIp(request.getRemoteAddr());

//7. boardDAO객체생성
BoardDAO bdao = new BoardDAO();

//8. 글쓰기 메서드 호출
bdao.insertBoard(bb);

//9. 목록페이지로 이동
response.sendRedirect("boardList.jsp");

DB에도 잘 들어가는 걸 확인할 수 있다.
동일한 페이지 두번 작성하면 upfile에 저장된 파일명은 자동적으로 뒤에 숫자가 붙어 고유한 파일명으로 업로드가능하다.