티스토리 뷰

   웹페이지에서 MultipartRequest객체를 이용한 파일업로드 방법을 소개한다.

 

   다른 방법들도 뒤적뒤적 해봤지만, MultipartRequest를 이용한 방법이 제일 쉬웠다.

 

 

 

   먼저 MultipartRequest를 이용하기 위해선, 라이브러리 파일을 다운 받아야 한다.

 

   다운로드☞ http://www.servlets.com/cos/

 

cos-26Dec2008.zip
다운로드

 

 

 

   cos-26Dec2008.zip 파일을 다운로드 받아서 압축을 풀면,

 

   lib 폴더에 cos.jar파일이 보일 것이다. cos.jar 파일을,,

 

 

   WEB-INF > lib 폴더 안에 집어넣자.

 

 

 

   * View (jsp 페이지)

<!--
    1. 전송하고자 하는 입력 폼을 <form>과 </form>사이에 위치해놓는다.
    2. action 값을 데이터를 전송받아서 처리할 곳으로 설정한다.
    3. method를 반드시 post로 설정해준다.
    4. enctype을 multipart/form-data로 설정한다.
    5. <form>과 </form>사이에 input type submit버튼을 위치시킨다.
 -->
 
<form action="<%=request.getContextPath() %>/test/test.do" method="post" enctype="multipart/form-data">
 
    <회원가입 양식><br>
    이름: <input type="text" name="m_name"><br>
    별명: <input type="text" name="m_nickname"><br>
    사진: <input type="file" name="m_file"><br><br>
     
    <input type="submit" value="전송~">
 
</form>

 

   위와 같이 코딩하면 아래와 같이 입력 폼이 보일 것이다.

 

 

 

   데이터 입력 후, 전송을 클릭했을 시 수행할 Controller나 Action에 넣을 자바 코드는 아래와 같다.

   (action 값을 다른 jsp페이지로 해놓고, 그 jsp 쪽에서 자바 코드를 수행함과 동시에 return page도 같이 겸하도록 해도 상관은 없지만, 그렇게 하면 코드가 더러워지고 유지보수가 까다로워진다)

 

 

   * Java Code

// 파일이 저장될 서버의 경로. 되도록이면 getRealPath를 이용하자.
// String savePath = "D:/Projects/workspace/projectName/WebContent/folderName";
String savePath = request.getServletContext().getRealPath("folderName");
 
// 파일 크기 15MB로 제한
int sizeLimit = 1024*1024*15;
 
//  ↓ request 객체,               ↓ 저장될 서버 경로,       ↓ 파일 최대 크기,    ↓ 인코딩 방식,       ↓ 같은 이름의 파일명 방지 처리
// (HttpServletRequest request, String saveDirectory, int maxPostSize, String encoding, FileRenamePolicy policy)
// 아래와 같이 MultipartRequest를 생성만 해주면 파일이 업로드 된다.(파일 자체의 업로드 완료)
MultipartRequest multi = new MultipartRequest(request, savePath, sizeLimit, "utf-8", new DefaultFileRenamePolicy());
 
 
// --------------------------아래는 전송 받은 데이터들을 DB테이블에 저장시키기 위한 작업들이다.--------------------------
// 테이블 설계, 쿼리문, DTO, DAO, Service.. 등은 만들어져 있다고 가정한다.
 
 
 
// MultipartRequest로 전송받은 데이터를 불러온다.
// enctype을 "multipart/form-data"로 선언하고 submit한 데이터들은 request객체가 아닌 MultipartRequest객체로 불러와야 한다.
String m_name = multi.getParameter("m_name");
String m_nickname = multi.getParameter("m_nickname");
 
// 전송받은 데이터가 파일일 경우 getFilesystemName()으로 파일 이름을 받아올 수 있다.
String fileName = multi.getFilesystemName("m_file");
 
// 업로드한 파일의 전체 경로를 DB에 저장하기 위함
String m_fileFullPath = savePath + "/" + fileName;
 
 
// 데이터들을 담을 그릇인 DTO(혹은 Bean) 객체를 생성 후, 데이터들을 set해준다.
MemberDTO memberDTO = new MemberDTO();
 
memberDTO.setM_name(m_name);
memberDTO.setM_nickname(m_nickname);
memberDTO.setM_fileFullPath(m_fileFullPath);
memberDTO.setM_fileName(fileName);
 
// Service 객체 생성.(서비스가 없고 DAO에서 직접 처리한다면 DAO 객체 생성)
MemberService service = MemberService.getInstance();
 
// 서비스에서 만들어놓은 insert 수행 메서드 사용. set으로 담아줬던 DTO를 넘겨서 insert 수행.
service.insertMember(memberDTO);
 
// 검증 처리는 생략했다.
// 검증은 Controller 혹은 Action에서 해도 되고, 입력 폼이 있는 jsp에서 해도 된다. 둘다 해도 되고..
// 그런 건 각자 알아서.
 
// 만약 return할 페이지에 방금 전송한 데이터들을 출력하고 싶다면 DTO를 속성에 담아준다.
request.setAttribute("memberDTO", memberDTO);
 
// ↓ 모든 것이 성공적으로 수행되었을 경우 return 될 page
return "blabla/blabla.jsp";

 

 

   어떤가. 쉽지 아니한가? 이보다 더 친절할 수는 없다.

 

   MultipartRequest를 이용할 경우, 파일 업로드를 수행하는 것은 사실상 단 한 줄 밖엔 되지 않기 때문에 굉장히 쉽게 파일 업로드를 구현할 수 있다.

 

 

 

↓ MultipartRequest 객체에 대한 자세한 내용을 보고 싶다면 아래의 API를 참고할 것

http://www.servlets.com/cos/javadoc/com/oreilly/servlet/MultipartRequest.html

 

 

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
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
글 보관함