티스토리 뷰
웹페이지에서 MultipartRequest객체를 이용한 파일업로드 방법을 소개한다.
다른 방법들도 뒤적뒤적 해봤지만, MultipartRequest를 이용한 방법이 제일 쉬웠다.
먼저 MultipartRequest를 이용하기 위해선, 라이브러리 파일을 다운 받아야 한다.
다운로드☞ http://www.servlets.com/cos/
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
'공장 (factory) > - Programming..' 카테고리의 다른 글
[JSP] naver SmartEditor2 이미지 첨부 기능 (수정 보완) (83) | 2013.09.24 |
---|---|
[JSP] 파일 다운로드. (8) | 2013.09.23 |
[Java] 자바로 외부파일 실행. (5) | 2013.09.10 |
[JSP] 전체 방문자 수/오늘 방문자 수 count (2) | 2013.08.26 |
구글맵(Google Maps JavaScript API v3) 주소로 검색하기 - Geocoding (10) | 2013.08.22 |