[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() : 서버에 업로드 된 파일의 정보를 객체로 얻어낼 때 사용
파일 업로드 구현 로직
-
index.jsp
- 파일 업로드 페이지 클릭 ->fileUploadPage.jsp
-
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
- 사이즈 검증 해서 retrun true or false
-
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로 이동
- fileUpload.jsp
- 요청 값에 따라 알림 띄어주고 fileUploadPage.jsp로 이동
Author And Source
이 문제에 관하여([Servlet&JSP] Chap 12. 파일 업로드 구현 로직(MVC2 패턴)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@woody_/ServletJSP-Chap-12.-파일-업로드-구현-로직MVC2-패턴저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)