-
Servlet - 파일 업로드비전공자 공부일기/:: WEB & Front-End 2019. 7. 2. 17:25
2019. 07. 02
웹에 파일을 업로드 하기 위해선
입력페이지에서 전달된 입력값과 입력파일을 반환받아 클라이언트에게 응답문서로 전달하는 서블릿
@WebServlet("/view.itwill") public class FileViewServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out=response.getWriter(); //비정상적인 요청에 대한 처리 - 에러코드 전달 또는 에러페이지 이동 if(request.getMethod().equals("GET")) { response.sendRedirect("file_view.html"); return; } //리퀘스트 메세지에 대한 캐릭터셋 변경 request.setCharacterEncoding("UTF-8"); //입력 전달값(올린이)을 반환받아 저장 //form 태그의 enctype 속성의 속성값으로 "multipart/form-data"로 설정한 경우 //모든 입력값 및 입력파일을 하나의 통합된 형태의 원시데이타로 전달 // => 입력값을 개별적으로 반환받아 사용 불가능 String name=request.getParameter("name"); //응답문서를 생성하여 클라이언트에게 전달 out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<title>Servlet</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>입력값 및 입력파일 내용 확인</h1>"); out.println("<hr>"); out.println("<p>올린이 = "+name+"</p>"); out.println("<hr>"); //form 태그의 enctype 속성의 속성값으로 "multipart/form-data"로 설정된 //경우 모든 입력값 및 입력파일을 제공받을 수 있는 입력스트림을 반환받아 저장 //HttpServletRequest.getInputStream() // => 리퀘스트 메세지의 원시데이타를 읽기 위한 입력스트림 // (ServletInputStream 인스턴스)을 반환하는 메소드 //ServletInputStream in=request.getInputStream(); InputStreamReader in=new InputStreamReader (request.getInputStream(), "UTF-8"); //입력스트림에서 읽어들인 데이타를 클라이언트의 응답문서로 전달 out.println("<pre>"); while(true) { int readByte=in.read(); if(readByte==-1) break; out.write(readByte); } out.println("</pre>"); out.println("</body>"); out.println("</html>"); } }
입력페이지에서 전달된 입력값과 입력파일명을 응답문서로 생성하여 클라이언트에게 전달하는 서블릿
=> 전달된 입력파일은 서버 디렉토리에 저장 - 파일 업로드
입력값과 입력파일을 처리하기 위해서는 외부 라이브러리 파일에 선언된 클래스를 사용
=> Apache 그룹에서 제공하는 commons fileUpload 라이브러리의 클래스 사용 - 선택적 파일 업로드
=> Oreilly 그룹에서 제공하는 cos 라이브러리의 클래스 사용 - 무조건적 파일 업로드
----- 아파치 그룹이 제공하는 선택적 파일 업로드는 좋긴 하지만 방법이 어려움
----- 오레일리 그룹의 무조건적 파일 업로드 형식은 다수 파일을 한꺼번에 업로드 할 때 편리
cos 라이브러리를 다운로드 받아 프로젝트에 빌드(Build) 처리하는 방법
1. http://www.servlets.com 접속 >> com.oreilly.servlet 클릭 >> cos-20.08.zip 다운로드
2. cos-20.08.zip >> 압축풀기 >> lib >> cos.jar(cos 라이브러리)
3. cos.jar >> 프로젝트 >> WebContent/WEB-INF/lib 폴더에 붙여넣기 - 라이브러리 파일 자동 빌드@WebServlet("/upload.itwill") public class FileUploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out=response.getWriter(); // 1) 비정상적인 요청에 대한 처리 - 에러코드 전달 또는 에러페이지 이동 if(request.getMethod().equals("GET")) { response.sendRedirect("file_upload.html"); return; } // 2) 입력파일을 저장하기 위한 서버 디렉토리의 절대경로를 반환받아 저장 String saveDirectory=request.getServletContext().getRealPath("/upload"); // 3) MultipartRequest mr=new MultipartRequest(request, saveDirectory, 30*1024*1024, "UTF-8"); // 4) 입력 전달값을 반환받아 저장 String name=mr.getParameter("name"); // 5) 전달된 입력파일명을 반환받아 저장 String fileone=mr.getFilesystemName("fileone"); String filetwo=mr.getFilesystemName("filetwo"); // 6) 응답문서를 생성하여 클라이언트에게 전달 out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<title>Servlet</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>입력값 및 입력파일명 확인</h1>"); out.println("<hr>"); out.println("<p>올린이 = "+name+"</p>"); out.println("<p>파일-1 = "+fileone+"</p>"); out.println("<p>파일-2 = "+filetwo+"</p>"); out.println("</body>"); out.println("</html>"); } }
1) 비정상적인 요청에 대한 처리
=> 에러코드 전달 또는 에러페이지 이동2) 입력파일을 저장하기 위한 서버 디렉토리의 절대경로를 반환받아 저장
=> 작업 디렉토리(Workspace)가 아닌 웹 디렉토리(WebApps)에 경로 반환
=> 웹 디렉토리에 입력파일이 업로드 되며 작업 디렉토리에 업로드 되지 않는다.(이클립스에서 확인 불가능)
프로젝트가 컨텍스트로 변환될 때 작업 디렉토리의 파일이 웹 디렉토리의 자원으로 자동 등록(동기화)
=> 동작화 처리될 때 작업 디렉토리의 파일이 없는 경우 웹 디렉토리에도 파일 미존재(업로드 파일 제거)
3) 생성자를 이용하여 MultipartRequest 인스턴스 생성
MultipartRequest 클래스 : 입력값과 입력파일을 처리하기 위한 기능을 제공하는 클래스
=> request : HttpsServletRequest 인스턴스 전달(필수)
=> saveDirectory : 입력파일이 업로드 되는 서버 디렉토리의 절대경로 전달(필수
=> int maxPostSize : 최대 전달 가능 입력값 및 입력파일의 크기(byte)를 전달(선택) --- 안하면 무제한, 하면 제한
=> String encoding : 입력값에 대한 캐릭터셋(인코딩 방식 설정)
=> FileRenamePolicy fileRenamePolicy : 파일명을 변경하는 FileRenamePolicy 인스턴스를 전달(선택)
FileRenamePolicy 인스턴스를 전달하지 않은 경우 동일한 이름의 파일을 업로드 하면 기존 파일 대신 업로드 처리(덮어씌우기)
=> FileRenamePolicy 인스턴스를 전달하면 동일한 이름의 파일을 업로드 할 경우 업로드 파일명을 변경하여 업로드 처리
FileRenamePolicy 인터페이스 상속받는 클래스를 작성하여 파일명 변경 처리
=> DefaultFileRenamePolicy 클래스 사용하여 파일명 변경 가능
4) 입력 전달값을 반환받아 저장
MultipartRequest.getParameter(String parameterName)
=> 입력태그의 name 속성값의 입력값을 전달받아 반환하는 메소드
5) 전달된 입력파일명을 반환받아 저장
MultipartRequest.getgetOriginalFileName(String parameterName)
=> 입력태그의 name 속성값의 입력 원본파일명을 반환하는 메소드
String fileone=mr.getOriginalFileName("fileone");
String filetwo=mr.getOriginalFileName("filetwo");
MultipartRequest.getFilesystemName(String parameterName)
=> 입력태그의 name 속성값의 실제 업로드 파일명을 반환하는 메소드6) 응답문서를 생성하여 클라이언트에게 전달
ㅇㅇ
'비전공자 공부일기 > :: WEB & Front-End' 카테고리의 다른 글
[WEB : Servlet] Session 세션 (6) 2019.07.03 [WEB : Servlet] Cookie 쿠키(생성, 읽기, 제거) (5) 2019.07.02 웹개발 - 서블릿 생명주기 Servlet Life Cycle (3) 2019.07.02 웹개발16 - 선택자(selector), 자식요소 (6) 2019.06.26 웹개발13 - 프로토타입 (4) 2019.06.20