프로그래밍 공부

2025.02.13 JSP 공부

3452 2025. 2. 13. 17:52

파일 업로드의 개요

 

웹 브라우저에서 서버로 파일을 전송하여 서버에 저장하는 것을 말한다.

 

기본에 사용하던 request는 텍스트만 저장할 수 있으므로 영상이나 이미지를 담기 위해서다른 오픈 라이브러리를 사용해야 한다.

 

 

파일 업로드를 위한 JSP 페이지

 

<form action = "JSP파일" method = "POST" enctype = "multipart/form-data">

        <input type = "file" name = "요청 파라미터 이름">

</form>

 

기존에 text만 옮기던 request 와는 다르게 이미지와 같은 파일을 옮겨야 하기 때문에 enctype과 input태그의 type을 text가 아닌 file로 바꿔서 이미지를 전송할 준비를한다.

 

 

MultipartRequest 클래스

 

multipart/form-data 유형과 POST 방식의 요청 파라미터를 분석한 후 일반 데이터와 파일로 구분하여 데이터에 접근한다.

 

텍스트와 이미지를 받아서 텍스트, 이미지를 각각 따로 분리해서 처리할수 있다.

 

하지만 외부 라이브러리이기 때문에 별도의 파일을 다운로드 받아야한다.

 

www.servlets.com/cos/ 

 

위의 사이트에서 cos-22.05zip 파일을 다운로드 받아서 압축을 푼 후

 

jar 파일을 이클립스 폴더 WEB-INF 안의 lib 폴더 안에 넣어준다.

 

 

MultipartRequest 클래스 생성

 

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

 

총 5개의 매개변수를 가진다.

 

request는 텍스트 데이터를 꺼낼때 쓰던 request 내장 객체이고,

 

saveDirectroy는 이미지를 저장할 저장공간 주소,

 

maxPostSize는 저장할 이미지의 최대 크기,

 

encoding은 인코딩 유형(utf-8),

 

policy는 같은 이름의 파일에 대해서 자동으로 이름을 바꿔주는 객체이다.

 

 

MultipartRequest 메서드

 

메서드 유형 설명
getContentType(String name) String 업로드된 파일의 콘텐츠 유형을 반환한다. 없으면 null을 반환한다.
getParameter(String name) String 요청 파라미터 이름이 name인 값을 전달받는다.
getParameterNames() java.util.Enumeration 요청 파라미터 이름을 Enumeration 객체 타입으로 반환한다.
getFile(String name) java.io.File 서버에 업로드된 파일에 대한 파일 객체를 반환한다. 없으면 null을 반환한다.
getFileNames() java.util.Enumeration 폼 페이지에 input 태그 내 type 속성 값이 file로 설정된 요청 파라미터 이름을 반환한다.
getFilesystemName(String name) String 사용자가 설정하여 서버에 실제로 업로드된 파일명을 반환한다. 중복되면 변경 된 파일명을 반환한다.
getOriginalFileName(String name) String 사용자가 업로드한 실제 파일명을 반환한다. 중복되면 변경 전 파일명을 반환한다.

 

 

기본적으로 request와 역할이 비슷하기 때문에 메서드도 비슷한 부분이 많으며, parameter에서 file로 바뀌었을 뿐이다.

 

또한 파일의 이름을 반환하는 메서드가 추가 되었는데, 이는 서버에 실제로 저장된 파일 이름을 볼 수 있으므로 변경 전 이름 보다는 변경 후의 이름이 더 중요하다.

 

파일도 텍스트와 비슷하게 키 값을 알면 multi.getFile("key") 모르면 multi.getFileNames()를 한 후에 Enumeration 객체의 메서드니까 hasMoreElements(), nextElement()를 이용해서 반환한다.

 

 

위의 방법은 자동으로 이미지를 저장하는 방식이고, 수동으로 일일히 저장하는 방법도 존재한다.

 

Commons-FileUpload를 이용한 파일 업로드

 

Commons-FileUpload는 서버의 메모리상에서 파일 처리가 가능하게 만들어 주는것으로 외부 파일을 다운로드 받아야 사용할수 있다.

 

http://commons.apache.org/downloads

 

위 사이트에서 commons-fileupload-1.5.bin.zip과 commons-io-2.13.0-bin.zip을 다운받아 압축을 푼 jar 파일을 WEB-INF 안에 lib 폴더 안에 넣는다.

 

파일 업로드 하는법

 

String fileUploadPath = "저장경로";

 

DiskFileUpload upload = new DiskFileUpload(); // DiskFileUpload 객체 생성

 

List items = upload.parseRequest(request); // 전송받은 파일을 List로 변환

 

Iterator params = items.iterator(); // 이터레이터 객체 params 생성

 

while(params.hasNext()) { // 이터레이터 이기 때문에 hasNext()를 이용해 리스트 탐색

FileItem item = (FileItem) params.next(); // params 안의 내용물은 FileItem 데이터타입으로 꺼내서 item에 대입

if(item.isFormField()) { // 텍스트인지 아닌지 유효성검사

String title = item.getString("utf-8"); // 한글일 경우 깨질수 있으니 인코딩시킴

System.out.prinln(title); // 출력

} else {

String fileName = item.getName(); // 파일 이름 추출

fileName = fileName.substring(fileName.lastIndexOf("\\")+1); // 경로 잘라내기

File file = new File(FileUploadPath + " / " + fileName); // file 변수에 저장경로 / 파일이름 의 형태로 저장

item.write(file); // 파일생성

System.out.println("파일이름 : " + fileName); // 파일이름 : 파일이름 형태로 출력

}

 

}

 

MultipartRequest를 사용하지 않으면 위와같이 많은 과정이 필요하다.

 

commons 패키지에도 멀티파트리퀘스트의 메서드와 대응하는 메서드들이 있다.

 

메서드 유형 설명
setRepositoryPath(String RepositoryPath) void 업로드된 파일을 임시로 저장할 디렉토리를 설정한다
setSizeMax(long sizeMax) void 최대 파일의 크기를 설정한다.
setSizeThreshold(int sizeThreshold) void 메모리상에서 저장할 최대 크기를 설정한다.
parseRequest(httpServletRequest req) List<fileItem> 멀티파츠/폼데이터 유형의 요청 파라미터를 가져온다.

 

 

'프로그래밍 공부' 카테고리의 다른 글

2025.02.17 JSP 공부  (0) 2025.02.17
2025.02.14 JSP 공부  (0) 2025.02.14
2025.02.12 JSP 공부  (0) 2025.02.12
2025.02.11 JSP 공부  (0) 2025.02.11
2025.02.10 JSP 공부  (0) 2025.02.10