jsp에서 파일업로드를 지원하는 라이브러리는 다양한 것들이 있지만 대표적인 것이 cos.jar이다.
📌COS 라이브러리 다운로드 및 설치
COS 라이브러리 파일을 http://www.servlets.com/cos 에서 다운로드 할 수 있다.
위 링크에 접속한 다음 cos-22.05.zip(현재 버전) 을 다운로드 받으면 된다
다운 받은 후 lib 폴더로 들어가 cos.jar 파일을 이클립스 해당 프로젝트 lib(라이브러리 폴더)에 추가한다.
📌MultipartRequest 클래스
위 단계를 거치면 COS 라이브러리에서 파일 업로드를 담당하는 클래스인 MultipartRequest를 사용할 수 있다. 이 클래스는 COS 라이브러리에서 가장 핵심적인 역할을 하는 클래스이다. MultipartRequest클래스는 파일 업로드를 담당하는 생성자와 여러 가지 메서드를 포함하고 있다. MultipartRequest 클래스는 안정성도 다른 파일 업로드 라이브러리보다 뛰어나고, 파일 중복 처리의 경우도 파일 중복 처리 인터페이스를 갖고 있기 때문에 중복 처리도 가능하다.
💡MultipartRequest 생성자
MultipartRequest(
javax.servlet.http.HttpServletRequest request,
java.lang.String saveDirectory,
int maxPostSize,
java.lang.String encoding,
FileRenamePolicy policy
)
- request
클라이언트에서 파일을 업로드할 경우 요청 값이 request객체로 넘어오기 때문에 이 객체를 MultipartRequest에서 사용할 수 있도록 request 인자로 넘겨지는 객체이다. - saveDirectory
서버 컴퓨터에 파일이 실질적으로 저장될 경로를 의미한다. - maxPostSize
한 번에 업로드할 수 있는 최대 파일 크기를 의미한다. 이 크기를 넘는 파일이 전송되어 올 경우에는 업로드가 처리되지 않는다. - encoding
파일의 인코딩 방식을 의미한다. - policy
파일 이름 중복 처리를 위한 클래스 객체를 의미한다. 기본적으로 'new DefaultFileRenamePolicy()'을 사용하지만, 적절한 클래스를 만들어서 사용하면 자신이 원하는 파일 중복 처리를 할 수 있다.
💡MultipartRequest 클래스의 메서드
- getParameterNames()
폼에서 전송된 파라미터의 타입이 file이 아닌 파라미터들의 이름들을 Enumeration 타입으로 반환한다. - getParameterValues()
폼에서 전송된 파라미터 값들을 배열로 받아온다. - getParameter()
request 객체에 있는 지정된 이름의 파라미터 값을 가져온다.
폼 태그 속성 중 enctype이 multipart/form-data로 넘어오기 때문에 일반 request 객체의 getParameter() 메서드로는 일반 파라미터 값을 받을 수 없다. 일반 파라미터 값을 반환받기 위해서는 MultipartRequest의 getParameter() 메서드를 사용하면 가능하다. - getFileNames()
파일을 여러 개 업로드할 경우 타입이 file인 파라미터 이름들을 Enumeration 타입으로 반환한다. - getFilesystemName()
서버에 실제로 업로드된 파일의 이름을 반환한다.
(추가적인 설명은 getOrigianlFileName()에서) - getOriginalFileName()
클라이언트가 업로드한 파일의 원본 이름을 반환한다.
이 메서드는 중복된 이름의 파일이 업로드되지 않으면 getFilesystemName() 메서드와 같은 역할을 한다. 하지만 중복된 이름의 파일이 업로드되어 생성자에서 파일 중복 처리를 해줄 경우(즉, 파일명이 바뀌었을 때) 이 두 메서드의 반환 값은 달라진다. 이 메서드는 파일이 중복되어 파일명이 바뀌어 업로드되더라도 업로드되기 전의 파일명을 반환한다. 반면에 getFilesystemName() 메서드는 실제로 이름이 변경되어 업로드된 파일명을 반환한다. - getContentType()
업로드된 파일의 마임 타입을 반환한다. - getFile()
서버에 업로드된 파일 객체 자체를 반환한다.
예제
fileUploadForm.jsp
파일 업로드를 하기 위해서 22줄에 enctype="multipart/form-data"로 설정해주고 <input>태그의 type 속성을 file로 설정한다.
업로드 폼을 작성하였으므로 이제 서버쪽 페이지를 작성하여야 한다.
업로드 페이지는 업로드 폼에서 전송되어 온 입력 양식의 파라미터 값을 전송받고, 클라이언트에서 선택한 파일들을 업로드하는 역할을 한다. 이 페이지가 업로드 기능 구현의 핵심 부분이다.
우리는 업로드 된 파일들이 upload라는 폴더에 업로드 되도록 한 번 작성해보도록 하자. 일단 webapp(혹은 WebContent)에 upload 폴더를 만들어준다. 그 후 다음과 같은 jsp를 작성한다.
fileUpload.jsp
2: 파일 업로드 처리를 담당하는 MultipartRequest 클래스를 import 한다.
3,4: 파일 이름 중복 처리 기능을 담당하는 DefaultFileRenamePolicy 클래스를 import 한다.
8: 업로드 파일의 최대 크기를 지정한다. 여기선 100MB로 지정한 것이고 이를 넘을시 Exception이 발생한다.
17,18: 실제로 파일 업로드를 담당하는 부분이다.
첫 번째 인자는 폼에서 전달된 파라미터 값을 얻기 위해 request 객체를 지정해주는 것이다.
두 번째 인자는 업로드될 파일의 위치를 의미한다.
세 번째 인자는 한 번에 업로드할 수 있는 파일의 크기를 의미한다.
네 번째 인자의 UTF-8은 파일 이름이 한글일 경우 문제되지 않도록 처리한 것이다.
다서 번째 인자는 똑같은 파일을 업로드할 경우 이름이 중복되지 않도록 자동으로 파일 이름을 변환해주는 기능
19,20: MultipartRequest 객체의 getParameter 메서드를 이용하여 클라이언트 폼에서 전송된 파라미터 값들을 가져온다. 폼의 enctype이 multipart/form-data로 설정되어 있기 때문에 일반 request 객체로는 폼에서 입력한 파라미터 값들을 받을 수가 없고 MultipartRequest 객체(multi)를 사용해야 한다.
22: 폼에서 전송되어온 파일 타입의 입력상자의 이름들을 반환한다.
42~49: 파일 다운로드를 처리하기 위해서 필요한 값들을 hidden 타입의 입력상자의 값으로 지정하고 이를 fileCheck.jsp에 전송해 주는 역할을 하는 form 영역을 정의한 부분이다.
50: "업로드 확인 및 다운로드 페이지 이동" 클릭했을 시 폼영역의 데이터들을 fileCheck.jsp 페이지로 전송처리하는 부분이다.
fileCheck.jsp (업로드 확인 및 다운로드 페이지)
'JSP & Servlet > 개념' 카테고리의 다른 글
[JSP] 메일 전송 (0) | 2022.04.11 |
---|---|
[JSP] 썸네일 이미지 (JAI API) (0) | 2022.04.10 |
[JSP & Servlet] JSP웹 오류페이지 예외처리 (0) | 2022.04.06 |
[Servlet] 쿠키(Cookie) - 사용자 화면 설정 정보 유지 (0) | 2022.04.06 |
[JSP & Servlet] 세션(Session) - 로그인 정보 유지 (0) | 2022.04.05 |