ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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) 응답문서를 생성하여 클라이언트에게 전달

    ㅇㅇ

    댓글

coding wanee