본문 바로가기
Backend/JSP

[JSP] 파일업로드

by 그적 2020. 10. 19.

파일 업로드란?
: 웹 브라우저에서 서버로 파일을 전송하여 서버에 저장하는 것.
- 파일 전송을 위해 JSP 페이지에 폼 태그를 사용한다.
- 전송된 파일 서버에 저장하기 위해 오픈 라이브러리를 이용한다.

"파일 업로드를 위한 폼 태그 이용 시 규칙"
1) form 태그의 method 속성은 반드시 POST 방식으로 설정한다.
2) form 태그의 enctype 속성은 반드시 multipart/form-data로 설정한다. // encoded type
3) form 태그의 action 속성은 파일 업로드를 처리할 JSP 파일로 설정한다.
4) input 태그의 type 속성을 file로 설정한다.
** 여러 파일을 업로드 하기위해서는 input 태그를 여러 개 사용하고, name 속성에 다른 값을 넣는다.

 

// 아래 코드와 같은 기본 구조를 가진다.

<form  enctype="multipart/for-data" action="process.jsp">
	<input type="file" name="file1">
	<input type="file" name="file2">
	<input type="submit" value="submit" >
</form>

 

 

업로드 처리 방법

: 단순 자바 코드로 작성하여 처리할 수 없기 때문에 오픈 라이브러리인 cos.jar이나 commons-fileupload.jar를 사용한다.

 

1) MultipartRequest 이용
- 웹 페이지에서 서버로 업로드되는 파일 자체만을 다룬다.
- 일반 데이터와 파일 데이터를 구분하여 파일 데이터에 접근한다.
- 한글 인코딩 값을 얻기 쉽고, 서버의 파일 저장 폴더에 동일한 파일명이 있으면 자동 변경된다.

- jsp 페이지에 page 디렉티브 태그에서 import 속성을 사용하여 com.oreilly.servlet.*를 불러온다.

 

2) 아파치 API 사용

- 파일 업로드 패키지
- jsp페이지에 page 디렉티브 태그에서 import 속성을 사용하여 org.apache.commons.fileupload.*를 불러온다.

 

 

① MultipartRequest

 다음과 같은 구조를 가진다.

MultipartRequest(javax.servlet.http.HttpServletRequest request,
	java.lang.String saveDirectory,
	int maxPostSize,                       // 설정된 최대 바이트를 넘길 경우, IO Exception 발생
	java.lang.String encoding
	FileRenamePolicy policy                // 파일명 중복될 경우, 파일 덮어쓰기 여부를 설정한다.
)	

(MultipartRequest 클래스 메소드)
// 일반 데이터의 경우엔 getParameter() 메서드를 통해 값을 받지만, 파일의 경우엔 getFileNames() 메서드를 이용하여 데이터를 받는다.
 - getContentType(String name) : String / 파일 유형 반환
 - getParameter(String name) : String / 요청 파라미터 반환
 - getParameterNames() : Enumeration / 요청 파라미터 이름 반환
 - getFile(String name) : File / 파일 객체 반환
 - getFileNames() : Enumeration / 파일 이름 반환
 - getFilesystemNames(String name) : String / 서버에 업로드된(시스템 상의) 파일명 반환
 - getOriginalFileName(String name) : String / 사용자가 업로드한 파일명 반환

 

② Commons-FileUpload

(DiskFileUpload 클래스 메소드)
 - setRepositoryPath(String repositoryPath) : void / 업로드된 파일을 임시로 저장할 디렉터리 생성
 - setSizeMax(long sizeMax) : void / 최대 파일 크기 설정
 - setSizeThreshold(int sizeThreshold) : void / 메모리상에 저장할 최대 크기 설정
 - parseRequest(HttpServletRequest request) : List<FileItem> / multipart/form-data 유형 데이터 반환

 

(FileItem 클래스 메소드)
 - isFormField() : boolean / 요청 파라미터가 일반 데이터일 경우 true, 파일인 경우 false
 - getFieldName() : String / 요청 파라미터의 이름 반환
 - getString() : String / 기본 문자로 인코딩한 요청 파라미터 값 반환
 - getString(String encoding) : String / 설정한 문자로 인코딩한 요청 파라미터 값 반환
 - getName() : String / 파일 이름 반환
 - getSize() : long / 파일 크기 반환
 - get() : byte[] / 파일을 바이트 배열로 반환
 - isInMemory() : boolean / 메모리에 저장된 상태일 경우 true, 임시 디렉터리에 저장된 경우 false
 - delete() : void / 파일 삭제
 - write() : void / 파일 저장

 

filename = filename.substring(filename.lastIndexOf("\\"+1);을 하는 이유?
>> 파일 이름에서 \\ 까지 자른 자르고, +1 한 문자열부터 가져오기 위해서 +1을 하는 것이다.

댓글