파일 업로드
- 웹 브라우저에서 서버로 파일을 전송하여 서버에 저장하는 것
- form 태그의 method는 반드시 post로 설정
- form 태그의 enctype 속성은 반드시 multipart/form-data로 설정
파일 업로드 처리 방법
MultipartRequest 이용 cos.jar 필요
아파치 API 이용 commons-fileupload.jar commons-io.jar 필요
MultipartRequest
- 웹 페이지에서 서버로 업로드되는 파일 자체만 다루는 클래스
ex)
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>File Upload</title>
</head>
<body>
<form name="fileForm" method="post" enctype="multipart/form-data"
action="fileupload01_process.jsp"> <!-- method 반드시 post enctype 반드시 "multipart/form-data" -->
<p> 이 름 : <input type="text" name="name">
<p> 제 목 : <input type="text" name="subject">
<p> 파 일 : <input type="file" name="filename">
<p> <input type="submit" value="파일 올리기">
</p>
</form>
</body>
</html>
fileupload01_process.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page import="com.oreilly.servlet.*"%>
<%@ page import="com.oreilly.servlet.multipart.*"%>
<%@ page import="java.util.*"%>
<%@ page import="java.io.*"%>
<% //스크립틀릿
MultipartRequest multi =
new MultipartRequest(request, "C:\\upload", 5 * 1024 * 1024, "utf-8", new DefaultFileRenamePolicy());
//saveDirectory : "C:\\upload"
// maxPostSize: 파일 최대 크기설정 encoding policy:덮어쓰기 여부 설정 설정하징 않으면 덮어씀
Enumeration params = multi.getParameterNames();
while (params.hasMoreElements()) { //files에 읽어올 요소가 남아있는지 확인 있으면 true 없으면 false
String name = (String) params.nextElement(); // nextElement() 다음 요소를 읽어 옴
String value = multi.getParameter(name);
out.println(name + " = " + value + "<br>");
}//end while
out.println("-----------------------------------<br>");
Enumeration files = multi.getFileNames();
while (files.hasMoreElements()) { //files에 읽어올 요소가 남아있는지 확인 있으면 true 없으면 false
String name = (String) files.nextElement(); // 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>");
if (file != null) {
out.println(" 파일 크기 : " + file.length());
out.println("<br>");
}//end if
}//end while
%>
commons 파일 업로드
- 서버의 메모리상에서 파일 처리가 가능하도록 지원
ex)
<%@page contentType="text/html; charset=utf-8"%>
<%@page import="org.apache.commons.fileupload.*"%>
<%@page import="java.util.*"%>
<%@page import="java.io.*"%>
<html>
<head>
<title>File Upload</title>
</head>
<body>
<%
String fileUploadPath = "C:\\upload"; // 저장 위치
DiskFileUpload upload = new DiskFileUpload(); // DiskFileUpload 클래스 생성
List items = upload.parseRequest(request);
Iterator params = items.iterator(); //items에 모든 값을 가져온다
while (params.hasNext()) { //Iterator hasNext() 읽어올 요소가 남아있는지 확인 있으면 true 없으면 false
FileItem fileItem = (FileItem) params.next(); // next() 다음 요소 읽어옴
if (!fileItem.isFormField()) { //isFormField 파일이 아닌 일반 데이터인 경우 true를 반환
String fileName = fileItem.getName();
fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
File file = new File(fileUploadPath + "/" + fileName);
fileItem.write(file); // 파일 저장
}//end if
}//end while
out.println("업로드 완료");
%>
</body>
</html>
쉽게 배우는 JSP 웹 프로그래밍
송미영 지음 한빛 아카데미