파일 업로드(file upoad)
1. 웹 브라우저에서 서버로 파일을 전송하여 서버에 저장하는 것
2. 서버로 업로드할 수 있는 파일
3. 웹 브라우저에서 서버로 파일을 전송하기위해 JSP페이지에 폼 태그 사용
4. 전송된 파일을 서버에 저장하기 위해 오픈 라이브러리를 이용
1번째 방법 - con
com.oreilly.servlet 라이브러리 다운로드
SQL편집기 이클립스에서 실행하기 - DB(MySQL)연결 설정
jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC
JSP 파일업로드 cos 사용 예제
fileupload_cos_1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파일 업로드(cos.jar이용)</title>
</head>
<body>
<!-- enctype 속성 : 전송타입 설정,
파일을 전송하기 위해서는 반드시 multipart/form-data로 지정함-->
<form action="fileupload_cos_1_process.jsp" name="fileForm" method="post"
enctype="multipart/form-data">
<p><b>이 름 : </b><input type="text" name="name" /></p>
<p><b>제 목 : </b><input type="text" name="title" /></p>
<p><b>파 일 : </b><input type="file" name="filename" /></p>
<p><input type="submit" value="파일 업로드" /></p>
</form>
</body>
</html>
fileupload_cos_1_process.jsp
<%@page import="java.io.File"%>
<%@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>
<head>
<meta charset="UTF-8">
<title>파일 업로드 처리</title>
</head>
<body>
<%
MultipartRequest multi = new MultipartRequest(request,
"C:\\workspace-jsp\\upload", //업로드될 경로 지정
10*1024*1024, //파일의 최대크기 지정(10mb)
"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); //파일 타입(mp3, image...)
File file = multi.getFile(name); //파일의 참조를 얻음.
out.println("요청들어온 파라미터 이름 : " +name+ "<br/>");
out.println("저장 파일 이름 : " +filename+ "<br/>");
out.println("실제 파일 이름 : " +original+ "<br/>");
out.println("파일 컨텐츠 유형 : " +type+ "<br/>");
if(file != null){
out.println("파일 크기 : " +file.length()+ "<br/>");
out.println("파일 경로 : " +file.getPath()+ "<br/>");
}
}
%>
</body>
</html>
fileupload_cos_1_process.jsp => Source연결 설정
Multipartrequest 선택하고 F3
External location => con/src
workspace에 upload 폴더 생성후 -> 주소복사
C:\\workspace-jsp\\upload -> 업로드될 경로 지정
업로드 결과
다중 파일 업로드 예제
fileupload_cos_2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파일 다중 업로드(cos.jar이용)</title>
</head>
<body>
<!-- enctype 속성 : 전송타입 설정,
파일을 전송하기 위해서는 반드시 multipart/form-data로 지정함-->
<form action="fileupload_cos_2_process.jsp" name="fileForm" method="post"
enctype="multipart/form-data">
<p><b>이 름1 : </b><input type="text" name="name1" />
<b>제 목1 : </b><input type="text" name="title1" />
<b>파 일1 : </b><input type="file" name="filename1" />
<p><b>이 름2 : </b><input type="text" name="name2" />
<b>제 목2 : </b><input type="text" name="title2" />
<b>파 일2 : </b><input type="file" name="filename2" />
<p><b>이 름3 : </b><input type="text" name="name3" />
<b>제 목3 : </b><input type="text" name="title3" />
<b>파 일3 : </b><input type="file" name="filename3" />
<p><input type="submit" value="파일 업로드" /></p>
</form>
</body>
</html>
fileupload_cos_2_process.jsp
<%@page import="java.io.File"%>
<%@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>
<head>
<meta charset="UTF-8">
<title>파일 다중 업로드 처리</title>
</head>
<body>
<%
MultipartRequest multi = new MultipartRequest(request,
"C:\\workspace-jsp\\upload", //업로드될 경로 지정
1000*1024*1024, //파일의 최대크기 지정(1000mb)
"UTF-8", //인코딩 방식
new DefaultFileRenamePolicy() //파일이름에 대한 정책(동일한 이름의 파일이 있다면 덮어쓰는것이 아니라 새로운 파일로 만들어주는 기능)
);
// 업로드된 이름과 제목을 가져온다.
String name1 = multi.getParameter("name1");
String title1 = multi.getParameter("title1");
String name2 = multi.getParameter("name2");
String title2 = multi.getParameter("title2");
String name3 = multi.getParameter("name3");
String title3 = multi.getParameter("title3");
Enumeration files = multi.getFileNames();
//표로 출력
//역순으로 업로드된 파일의 이름을 가져온다.
String file3 = (String)files.nextElement();
String filename3 = multi.getFilesystemName(file3); //파일의 이름
String file2 = (String)files.nextElement();
String filename2 = multi.getFilesystemName(file2); //파일의 이름
String file1 = (String)files.nextElement();
String filename1 = multi.getFilesystemName(file1); //파일의 이름
%>
<table border="1">
<tr>
<th width="100">이름</th>
<th width="100">제목</th>
<th width="100">파일</th>
</tr>
<%
out.print("<tr><td>" +name1+ "</td>");
out.print("<td>" +title1+ "</td>");
out.print("<td>" +filename1+ "</td></tr>");
out.print("<tr><td>" +name2+ "</td>");
out.print("<td>" +title2+ "</td>");
out.print("<td>" +filename2+ "</td></tr>");
out.print("<tr><td>" +name3+ "</td>");
out.print("<td>" +title3+ "</td>");
out.print("<td>" +filename3+ "</td></tr>");
%>
</table>
<%
out.println("------------------------------------------------------------<br/>");
Enumeration files1 = multi.getFileNames();
while(files1.hasMoreElements()) {
String name = (String)files1.nextElement();
String filename = multi.getFilesystemName(name); //파일이름 얻기
String original = multi.getOriginalFileName(name); //이전 파일이름 얻기
String type = multi.getContentType(name); //파일 타입(mp3, image...)
File file = multi.getFile(name); //파일의 참조를 얻음.
out.println("요청들어온 파라미터 이름 : " +name+ "<br/>");
out.println("저장 파일 이름 : " +filename+ "<br/>");
out.println("실제 파일 이름 : " +original+ "<br/>");
out.println("파일 컨텐츠 유형 : " +type+ "<br/>");
if(file != null){
out.println("파일 크기 : " +file.length()+ "<br/>");
out.println("파일 경로 : " +file.getPath()+ "<br/>");
}
}
%>
</body>
</html>
2번째 방법 - commons.apache.org 아파치 톰켓 이용
commons.apache.org 라이브러리 다운로드
commons.apache.org/proper/commons-fileupload/download_fileupload.cgi
commons.apache.org/proper/commons-io/download_io.cgi
JSP 파일업로드 commons 사용 예제
fileupload_commons_1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파일 업로드(commons.jar이용)</title>
</head>
<body>
<!-- enctype 속성 : 전송타입 설정,
파일을 전송하기 위해서는 반드시 multipart/form-data로 지정함-->
<form action="fileupload_commons_1_process.jsp" name="fileForm" method="post"
enctype="multipart/form-data">
<p><b>파 일 : </b><input type="file" name="filename" /></p>
<p><input type="submit" value="파일 업로드" /></p>
</form>
</body>
</html>
fileupload_commons_1_process.jsp
<%@page import="java.io.File"%>
<%@page import="java.util.Iterator"%>
<%@page import="java.util.List"%>
<%@page import="org.apache.commons.fileupload.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파일 업로드(commons)</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
//업로드를 할 서버의 경로 지정함.(PC의 특정위치)
String fileUploadPath = "C:\\workspace-jsp\\upload";
DiskFileUpload upload = new DiskFileUpload();
//요청된 파라미터 전달받기 위해서 parseRequest() 호출
List items = upload.parseRequest(request);
Iterator params = items.iterator();
while(params.hasNext()){
FileItem fileItem = (FileItem)params.next();
//isFormField() : 요청한 파라미터가 파일이 아니라 일반데이터인 경우 true 리턴
//false = 파일이라는 의미
if(!fileItem.isFormField()) {
String fileName = fileItem.getName();
//경로출력
out.println("1 : " +fileName+ "<br/>");
/* 파일명 앞에 있는 경로를 제거해서 파일명에 저장.
+1을 하는 이유 : lastIndexOf()를 찾지 못하면 -1을 리턴한다.
=> 0값을 만들어주기 위해서 +1한다.
*/
//C:\\workspace-jsp\\upload\\파일이름 => 파일이름만 추출
fileName = fileName.substring(fileName.lastIndexOf("\\")+1);
File file = new File(fileUploadPath +"/"+ fileName);
fileItem.write(file);
out.println("파일이름 : " +fileName+ "<br/>");
out.println("파일 저장 경로 : " +file.getPath()+ "<br/>");
}
}
%>
</body>
</html>