[JSP] 파일 업로드
파일 전송을 위한 form 태그
웹 브라우저에서 서버로 파일을 전송하기 위해 JSP 페이지에 폼(form) 태그 작성
-
form 태그의 method 속성 = POST 여야 함
-
form 태그의 enctype(전송 데이터 형식 설정) 속성 = multipart/form-data
-
form 태그의 action 속성 = 파일 업로드를 처리할 JSP 파일로 설정
-
input 태그의 type 속성 = file로 설정
cos.jar - MultipartRequest
-
오픈 라이브러리 cos.jar 다운로드 해 사용 (http://servlets.com/cos/)
-
JSP 페이지에 디렉티브 태그 import 속성 사용 > com.oreilly.servlet.*
-
webabb(webContent) > WEB-INF > lib 폴더 안에 cos.jar 파일 위치
-
MultipartRequset 클래스 생성 / MultipartRequset 생성자의 매개변수
MultipartRequest( javax.servlet.http.HttpServletRequest request, java.lang.String saveDirectory, int maxPostSize, java.lang.String encoding, FileRenamePolicy policy )
-
request : Request 내장 객체 설정
-
saveDirectory : 서버의 파일 저장 경로 설정
-
maxPostSize : 파일의 최대 크기(바이트 단위) 설정
-
encoding : 인코딩 유형 설정
-
policy : 파일명 변경 방법 설정, saveDirectory에 파일이 중복되는 경우 덮어쓰기 여부, 설정하지 않을 시에 파일명 덮어씀
-
-
MultipartRequest 메소드
-
웹 브라우저에서 전송되는 요청 파라미터
-
일반 데이터는 getParameter()로 메소드 값 받음
-
파일은 getFileNames() 메소드 이용하여 데이터를 받음
-
-
String getContentType(String name) : 업로드된 파일의 콘텐츠 유형 반환, 파일이 없다면 null 반환
-
String getParameter(String name) : 요청 파라미터 이름이 name인 값을 전달받음
-
java.util.Enumeration getParameterNames() : 요청 파라미터 이름을 Enumeration 객체 타입으로 반환
-
java.io.File getFile(String name) : 서버에 업로드된 파일에 대한 파일 객체 반환, 파일이 없으면 null 반환
-
java.util.Enumeration getFileNames() : input 태그 내 type 속성 값이 file로 설정된 요청 파라미터의 이름을 반환
-
String getFilesystemName(String name) : 사용자가 설정하여 서버에 실제 업로드된 파일명 반환, 파일명 중복 시 변경된 파일명 반환
-
String getOriginalFineName(String name) : 사용자가 업로드한 실제 파일명 반환, 파일명 중복 시 변경 전의 파일명 반환
-
Commons-FileUpload
-
파일 업로드 패키지
-
서버의 메모리상에서 파일 처리가 가능하도록 지원
-
오픈 라이브러리 파일 commons-fileupload.jar, commons-io.jar 다운로드 해 사용
-
webabb(webContent) > WEB-INF > lib 폴더 안에 commons-fileupload.jar, commons-io.jar 파일 위치
-
JSP 페이지에 page 디렉티브 태그 import 속성 사용, org.apache.commons.fileupload.* 설정
-
DiskFileUpload 클래스 메소드
-
setRepositoryPath(String repositoryPath) : 업로드된 파일을 임시 저장 할 디렉토리 설정
-
setSizeMax(long sizeMax) : 최대 파일 크기 설정
-
setSizeThreshold(int sizeThreshold) : 메모리상에 저장할 최대 크기 설정
-
parseRequest(HttpServletRequest req) : multipart/form-data 유형의 요청 파라미터를 가져옴
-
-
FileItem 클래스 메소드
-
boolean isFormField() : 요청 파라미터가 파일이 아닌 일반 데이터인 경우 true 반환
-
String getFieldName() : 요청 파라미터의 이름을 얻음
-
String getString() : 기본 문자 인코딩을 사옹해 요청 파라미터의 값을 얻음
-
String getString(String encoding) : 설정한 문자 인코딩을 사용해 요청 파라미터의 값을 얻음
-
String getName() : 경로 포함 업로드 된 파일의 이름을 얻음
-
long getSize() : 업로드 된 파일의 크기를 얻음
-
byte[] get() : 업로드 된 파일을 바이트 배열로 얻어옴
-
boolean isInMemory() : 업로드 된 파일이 메모리에 저장된 상태 > true 반환, 임시 디렉토리에 저장 > false 반환
-
void delete() : 파일과 관련된 자원 삭제, 메모리상에 저장된 경우 할당된 메모리 반환, 임시 파일로 저장된 경우 파일 삭제
-
void write() : 파일과 관련된 자원 저장
-
String getContentType() : 웹 브라우저가 전송하는 컨텐츠 유형 반환, 정의되어 있지 않은 경우 null 반환
-
cos.jar를 사용한 파일 업로드 예제
-
FileUpload_Cos.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>파일 업로드 - cos.jar</title> </head> <body> <form action="FileUpload_CosTest.jsp" method="post" enctype="multipart/form-data"> 제목 <input type="text" name="title"> <br><br> 파일 <input type="file" name="file"> <br><br> <input type="submit" value="파일업로드"> </form> </body> </html>
-
FileUpload_CosTest.jsp
<%@page import="java.util.Enumeration"%> <%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%> <%@page import="com.oreilly.servlet.MultipartRequest"%> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>파일 업로드 - cos.jar</title> </head> <body> <% MultipartRequest mpreq = new MultipartRequest( request, "C:\\uploadtest", 10*1024*1024, "utf-8", new DefaultFileRenamePolicy() ); Enumeration param = mpreq.getFileNames(); while(param.hasMoreElements()){ String name = (String)param.nextElement(); String fileName = mpreq.getFilesystemName(name); String originalFileName = mpreq.getOriginalFileName(name); out.println(name + "<br>"); out.println(fileName + "<br>"); out.println(originalFileName); } %> </body> </html>
-
실행결과
new DefaultFileRenamePolicy() -> 같은 이름의 파일 업로드 시 파일 이름이 변경되어 저장되는 것을 볼 수 있다.