[Servlet&JSP] Chap 12. 파일 업로드 구현 로직(MVC2 패턴)

준비 사항 : cos.jar 파일 WebContent/WEB-INF/lib 폴더에 복사
COS 라이브러리 : http://www.servlets.com/cos/

기본적인 file 업로드 태그

<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
</form>
  • 파일의 데이터는 일반적인 String형태가 아닌 Binary 형태이기 때문에 enctype(인코딩 타입)을 multipart/form-data 형태로 바꾸어 주어야 함
  • multipart/form-data:
    • 일반적으로 파일의 경우 네트워크 상에서 한번에 크게 보낼 수 없기 때문에 나누어져 보내게 됨
    • multipart라고 명시 하게 됨으로써 파일형태로 조각내서 보낸다는것을 의미함



MultipartRequest 클래스

  • cos.jar 라이브러리를 통하여 Servlet에서 MultipartRequest 클래스를 제공

  • 생성자

    MultipartRequest multi = new MultipartRequest(request, saveDirectiory, maxPostSize, encoding, policy);

  • request : MultipartRequest와 연결할 request 객체

  • saveDirectory : 서버 측에 저장될 경로

  • maxPostSize : 최대 파일 크기

  • encoding : 파일의 인코딩 방식(파일 이름이 한글일 경우 매개 변수 값을 utf-8로 줌)

  • policy : 파일 중복 처리를 위한 매개 변수
    policy는 중복 처리를 해주는 매개변수로서 'b.bmp' 파일을 업로드 하였는데 다시 같은 파일을 업로드 할 경우 'b1.bmp' 등으로 자동으로 파일 중복 처리를 해줌
    매개 변수 값으로는 'new DefaultFileRenamePolicy()'를 사용 함

유용한 메소드

getparameterNames() : 폼에서 전송된 파라미터의 이름을 Enumeration 타입으로 리턴
getParameterValues() : 폼에서 전송된 파라미터들을 배열로 받아옴
getParameter() : 객체에 있는 해당 파라미터의 값을 가져옴
getFileNames() : 파일을 여러 개 업로드 할 경우 그 값들을 Enumeration 타입으로 리턴
getFilesystemName() : 서버에 실제로 업로드 된 파일의 이름을 의미
getOriginalFilename() : 클라이언트가 업로드한 파일의 원본 이름을 의미
getContentType() : 업로드 파일의 컨텐트 타입을 얻을 때 사용
getFile() : 서버에 업로드 된 파일의 정보를 객체로 얻어낼 때 사용




파일 업로드 구현 로직

  1. index.jsp

    • 파일 업로드 페이지 클릭 ->fileUploadPage.jsp
  2. fileUploadPage.jsp

    • 폼태그 인코딩 enctype="multipart/form-data"
    • input 태그 작성(type=file, submit)
    • 파일 업로드하면 이벤트 발생(onchange)
      • 파일 사이즈(file.files[0].size) 생성(소수점 3자리: fileSize.toFixed(3))
    • submit 클릭 이벤트 발생
      • 사이즈 검증 해서 retrun true or false
        • 정상이면: FileUploadServlet.java (/file/fileUpload.do) 이동
        • 비정상이면 : 알림 띄여주고 이동 X
  3. FileUploadServlet.java (/file/fileUpload.do)

    • 파일 업로드를 구현하려면 COS 라이브러리를 활용 해야 한다.
    • COS 라이브러리에서 MultipartRequest 객체를 제공해준다.
  • MultipartRequest 객체를 만들려면 아래의 5개의 값이 있어야한다.

    1) request 객체(Servlet에서 제공)
    2) 실제 업로드 되어야하는 경로 세팅(filePath)

    • 단위 : 바이트
    • ex) request.getServletContext().getRealPath("/upload")

    3) 최대 파일 사이즈 크기 설정 값

    • ex) int uploadFileSizeLimit = 1024 1024 1024;

    4) 파일 이름에 대한 인코딩 처리 값

    • ex) String encType="UTF-8";

    5) 정책 관련된 객체(동일 이름의 파일이 업로드 되면 어떻게 처리할 것인가에 대한 정책 관련 객체)

    • ex) DefaultFileRenamePolicy 객체를 사용하게 되면, 중복된 파일 이름을 가지고 있는 파일이 업로드 되는 경우 중복된 파일에 대하여 자동으로 뒤에 숫자를 붙여서 처리함
    • ex) test.txt 를 업로드 한 뒤, 다시 또 text.txt 라는 파일을 업로드하면 2번째 업로드된 파일은 자동으로 test1.txt라는 이름으로 변경된다는 정책임
    • MultipartReqeust 객체를 생성할때 설정
  • MultipartReqeust 객체를 생성

    • ex) MultipartRequest multi = new MultipartRequest(request, 경로, 사이즈, 인코딩, new DefaultFileRenamePolicy());
  • 파일 크기 검증

    • File 객체 생성
    • File 크기(length()) 가 50MB 보다 크다면 File 객체 삭제, JSP파일로 이동하여 알람 띄어주고, doGet 메소드 중지

  • DB에 데이터 저장하기 위한 정보 세팅

    1) 원본 파일 이름 가져오기
    String originalFileName= multi.getFilesystemName("file");

    2) 업로드 유저명
    String fileUser= ((Member)request.getSession().getAttribute("member")).getUserId();

    3) 업로드 시간(Calendar Class)
    long currentTime =Calendar.getInstance().getTimeInMillis();

    4) 포맷을 지정하여 업로드 시간 구현(import java.sql.Timestamp;)
    SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");
    Timestamp uploadTime = Timestamp.valueOf(formatter.format(currentTime));

    5) 파일 이름 변경 후 변경된 파일 이름 저장(import java.io.File;)
    File file = new File(uploadFilePath+"\"+originalFileName);
    file.renameTo(new File(uploadFilePath+"\"+fileUser+""+currentTime+"_kh"));
    파일의 이름을 유저명
    업로드시간(밀리세컨드)kh 라는 이름으로 변경하겠다는 의미
    String changedFileName= fileUser+"
    "+currentTime+"_kh";

    6) 해당 파일의 경로 저장(변경된 파일 이름)
    String filePath=uploadFilePath+"\"+changedFileName;

    7) 파일의 사이즈(파일 사이즈가 클 수 있으므로, long type 사용)
    File reFile=new File(filePath);
    long fileSize= reFile.length();

    • 데이터 객체에 담아 비즈니스로직 처리( <-> Service <-> DAO)
    • 리턴값 받아서 리턴 값에 따라 요청값 설정 후 fileUpload.jsp로 이동
  1. fileUpload.jsp
  • 요청 값에 따라 알림 띄어주고 fileUploadPage.jsp로 이동

좋은 웹페이지 즐겨찾기