티스토리 뷰

공장 (factory)/- Programming..

[JSP] MultipartRequest를 이용한 파일 업로드

공부하는 나부랭이, 무중력고기 2013.09.17 16:15

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


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




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


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


cos-26Dec2008.zip




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


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



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




   * View (jsp 페이지)



<회원가입 양식>
이름:
별명:
사진:


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




   데이터 입력 후, 전송을 클릭했을 시 수행할 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



댓글
  • 지나가는 게시판을 만드는 중인데 정리잘된 글이 맘에들어 제 블로그로 퍼가겠습니다.
    2014.03.05 16:34
  • 하비 파일첨부 헤메고 있었는데 이글 보고 성공했습니다.
    감사합니다. 글좀 퍼가겠습니다. ^^
    2014.07.21 19:43
  • BlogIcon 공부하는 나부랭이, 무중력고기 퍼가실 거면 트랙백을 걸어주시거나 링크로 해주세요. 전체글 복사 붙여넣기는 표절입니다. 2014.07.23 09:22 신고
  • 하비 헉 죄송합니다. 어디다 등록하려 한건 아니고요 제가 개인적으로 노트프로그램에 넣어 둘려고 했는데 삭제 하겠습니다. 몰랐네요 죄송합니다. ㅎㅎ;; 2014.07.23 21:33
  • 김마포 안녕하세요 글 잘봤습니다!! 포스팅 하신대로 따라해봤는데

    Corrupt form data: premature ending 라고 콘솔창에 에러가 뜨는 경우는 뭔가요?

    web.xml에 따로 설정해주신 것도 잇나요??
    2014.11.10 12:58
  • BlogIcon 공부하는 나부랭이, 무중력고기 web.xml에 따로 설정해주는 것은 없습니다.
    다른쪽에서 발생하는 에러인 것 같네요. 디버깅 해보시기 바랍니다.
    2014.11.11 13:19 신고
  • clickpg 너무도 친절하고 좋은 정보 공유네요 감사합니다. 덕분에 많은걸 배워가네요 2016.12.29 15:52
  • ljh6317 안녕하세요 혹시 MultipartRequest 클래스를 이용해서 업로드가 아닌, 타 서버로 파일전송도 가능한가요?
    구글링해보면, 거의.. upload기능만되는거같아서요..
    2016.12.30 10:39
  • 황뱅 정리가 너무잘되어있네요 어려운부분 이라 이해가안됬었는데 잘보고 갑니다. 2017.11.08 20:37
  • 선도 전자정부프레임워크에 적용허려고하는데 jar 파일을 Maven Dependencies 에 넣어아햐나요?
    JRE system Libary에 넣어야하나요?
    2018.09.18 20:41
  • 허흥 이보다 더 친절할 수 없다... 확 와닿았습니다 다른거 많이 봣는데 여기서 확이해가네요 감사히잘보고가요 2019.05.12 21:30
댓글쓰기 폼
Total
1,310,586
Today
0
Yesterday
1,100
«   2019/06   »
            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            
글 보관함