정리노트
[JSP] 파일 업로드
망고고래
2023. 12. 7. 17:28
7장. 파일 업로드
1. 파일 업로드의 개요
1.1 파일 업로드를 위한 JSP 페이지
폼 태그 작성 형식
<form action = "JSP 파일" method = "POST" enctype = "multipart/form-data">
<input type = "file" name = "요청 파라미터 이름">
</form>
- form 태그의 method 속성은 반드시 POST(get은 용량이 제한되어있음)
- form 태그의 enctype 속성은 반드시 multipart/form-data
- form 태그의 action 속성은 파일 업로드를 처리할 JSP 파일
- input 태그의 type 속성은 file. 여러 파일 업로드시 2개 이상의 input 태그, name 속성에 서로 다른 값 설정
1.2 파일 업로드 처리 방법
1)MultipartRequest 이용
가장 간단한 방법
cos.jar 필요
2)아파치 API 이용
편리하고 강력한 API 제공
commons-fileupload.jar, commons-io.jar 필요
2. MultipartRequest를 이용한 파일 업로드
MultipartRequest
웹페이지에서 서버로 업로드되는 파일 자체만 다루는 클래스
웹브라우저가 전송한 multipart/form-data 유형과 POST 방식의 요청 파라미터 등을 분석한 후, 일반 데이터와 파일 데이터를 구분하여 파일 데이터에 접근
한글 인코딩 값을 얻기 쉬움
서버의 파일 저장 폴더에 동일한 파일명이 있으면 파일명을 자동으로 변경
2.1 MultipartRequest 클래스 생성
MultipartRequest(javax.servlet.http.HttpServletRequest request,
java.lang.String saveDirectory,
int maxPostSize,
java.lang.String encoding,
FileRenamePolicy policy)
Multipart Request 생성자의 매개변수
매개변수 | 설명 |
request(객체) | Request 내장 객체 |
saveDirectory(문자열) | 서버의 파일 저장 경로 설정 |
maxPostSize(정수) | 파일의 최대 크기(바이트 단위) 설정. 초과시 IOException 발생 |
encoding(문자열) | 인코딩 유형 설정 |
policy(객체) | 파일명 변경 정책. saveDirectory에 파일명이 중복되는 경우 덮어쓰기 여부 설정. 설정하지 않으면 덮어씀 |
<%
MultipartRequest multi = new MultipartRequest
(request,
"C:\\upload",
5*1024*1024
"utf-8",
new DefaultFileRenamepolicy());
%>
MultipartRequest 메서드
메서드 | 유형 | 설명 |
getContentType(String name) | String | 업로드된 파일의 콘텐츠 유형 반환. 파일이 없으면 null 반환 |
getFile(String name) | java.io.File | 서버에 업로드된 파일에 대한 파일 객체 반환. 파일이 없으면 null 반환 |
getParameter(String name) | String | 요청 파라미터 이름이 name인 값 전달(text 데이터) |
get ParameterNames() | java.util.Enumeration | 요청 파라미터 이름들 반환(text) |
getFilesystemName(String name) | String | 서버에 실제로 업로드된 파일명. 파일명이 중복되면 변경된 파일명 반환(이미지) |
getOriginalFileName(String name) | String | 사용자가 업로드한 파일명. 파일명이 중복되면 변경 전의 파일명 반환(이미지) |
getFileNames() | java.util.Enumeration | 폼 페이지에 input 태그 내 type 속성 값이 file로 설정된 요청 파라미터의 이름 반환(이미지) |
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>File Upload</title>
</head>
<body>
<form name="fileForm" method="post" enctype="multipart/form-data" action="fileupload01_process.jsp">
<p>이름: <input type="text" name="name">
<p>제목: <input type="text" name="subject">
<p>파일: <input type="file" name="filename">
<p><input type="submit" value="파일 올리기">
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import = "com.oreilly.servlet.*" %>
<%@ page import = "com.oreilly.servlet.multipart.*"%>
<%@ page import = "java.util.*" %>
<%@ page import = "java.io.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
String save = request.getServletContext().getRealPath("/img");
System.out.println(save);
MultipartRequest multi = new MultipartRequest(request, save, 5*1024*1024,"utf-8", new DefaultFileRenamePolicy());
Enumeration params = multi.getParameterNames();
while(params.hasMoreElements()){
String name = (String) params.nextElement();
String value = multi.getParameter(name);
out.println(name + " = " + value + "<br>");
}
out.println("―――――――――――――――――――<br>");
Enumeration files = multi.getFileNames();
while(files.hasMoreElements()){
String name = (String) files.nextElement();
String filename = multi.getFilesystemName(name);
String original = multi.getOriginalFileName(name);
String type = multi.getContentType(name);
File file = multi.getFile(name);
out.println("요청 파라미터 이름: " + name + "<br>");
out.println("실제 파일 이름: " + original + "<br>");
out.println("저장 파일 이름: " + filename + "<br>");
out.println("파일 콘텐츠 유형: " + type + "<br>");
out.println("<img src = ./img/"+filename+">");
out.println("html 코드에 적힐 내용");
out.println("<h1>개복치</h1>");
if(file != null){
out.println("파일 크기: "+file.length());
out.println("<br>");
}
}
//response.sendRedirect("out.html");
//html 문서로 넘겨서 문서의 값 전송
%>
</body>
</html>
3. Commons-FileUpload를 이용한 파일 업로드
- DiskFileUpload 객체 생성
- DiskFileUpload 클래스의 메서드로 multipart/form-data 유형의 요청 파라미터 가져옴
- FileItem 클래스의 메서드로 요청 파라미터가 일반 데이터인지 파일인지 분석/처리, 파일 업로드
DiskFileUpload 클래스의 메서드
메서드 | 유형 | 설명 |
setRepositoryPath(String repositoryPath) | void | 업로드된 파일을 임시로 저장할 디렉터리 |
setSizeMax(long sizeMax) | void | 파일의 최대 크기 설정 |
setSizeThreshold(int sizeThreshold) | void | 메모리상에 저장할 최대 크기 |
parseRequest(HttpServletRequest req) | List<FileItem> | multipart/form-data 유형의 요청 파라미터를 가져옴 |
FileItem 클래스의 메서드
메서드 | 유형 | 설명 |
isFormField() | boolean | 요청 파라미터가 text 데이터이면(이미지 아님) true 반환 |
getFieldname() | String | 요청 파라미터의 이름을 얻어옴 |
getString() | String | 기본 문자 인코딩을 사용해서 요청 파라미터의 값을 얻어옴 |
getString(String encoding) | String | 설정한 문자 인코딩을 사용해서 요청 파라미터의 값을 얻어옴 |
getName() | String | 업로드된 파일(경로 포함)의 이름을 얻어옴 |
getSize() | long | 업로드된 파일의 크기를 얻어옴 |
get() | byte[] | 업로드된 파일을 바이트 배열로 얻어옴 |
isInMemory() | boolean | 업로드된 파일이 메모리에 저장된 상태인 경우 true 반환, 임시 디렉터리에 저장된 경우 false 반환 |
delete() | void | 파일과 관련된 자원 삭제. 메모리상에 저장된 경우 할당된 메모리 반환/임시 파일로 저장된 경우 파일 삭제 |
write() | void | 파일과 관련된 자원 저장 |
getContentType() | String | 웹 브라우저가 전송하는 콘텐츠 유형 반환, 정의되어 있지 않은 경우 null 반환 |
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>File Upload</title>
</head>
<body>
<form action = "fileupload03_process.jsp" method = "post" enctype = "multipart/form-data">
<p>파일: <input type="file" name="filename">
<p><input type="submit" value="파일 올리기">
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="org.apache.commons.fileupload.*"%>
<%@ page import = "java.util.*" %>
<%@ page import = "java.io.*" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>File Upload</title>
</head>
<body>
<%
String fileUploadPath = "C:\\upload";
DiskFileUpload upload = new DiskFileUpload();
List items = upload.parseRequest(request);
Iterator params = items.iterator();
while(params.hasNext()){
FileItem fileItem = (FileItem)params.next();
if(!fileItem.isFormField()){
String fileName = fileItem.getName();
fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
File file = new File(fileUploadPath + "/" + fileName);
fileItem.write(file);
}
}
%>
</body>
</html>