파일 업로드의 개요
웹 브라우저에서 서버로 파일을 전송하여 서버에 저장하는 것을 말한다.
기본에 사용하던 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 방식의 요청 파라미터를 분석한 후 일반 데이터와 파일로 구분하여 데이터에 접근한다.
텍스트와 이미지를 받아서 텍스트, 이미지를 각각 따로 분리해서 처리할수 있다.
하지만 외부 라이브러리이기 때문에 별도의 파일을 다운로드 받아야한다.
위의 사이트에서 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 |