============================ UploadWriteForm.jsp ==============================
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title>cos 업로드 테스트 폼</title>
</head>
<body>
<form method="post" action="/testProject/UploadServlet" enctype="multipart/form-data">
<table border="1" width="60%">
<tr>
<td>올린이</td>
<td><input type="text" name="userName" size="10"></td>
</tr>
<tr>
<td>올린이</td>
<td><input type="password" name="userPasswd" size="10"></td>
</tr>
<tr>
<td>파일1</td>
<td><input type="file" name="upFile1"></td>
</tr>
<tr>
<td>파일2</td>
<td><input type="file" name="upFile2"></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="전송">
</td>
</tr>
</table>
</form>
</body>
</html>
========================== web.xml ================================
.
.
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>test.util.UploadServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>DownloadServlet</servlet-name>
<servlet-class>test.util.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/UploadServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>DownloadServlet</servlet-name>
<url-pattern>/DownloadServlet</url-pattern>
</servlet-mapping>
.
.
.
========================== UploadServlet.java ================================
package test.util;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
import java.util.*;
public class UploadServlet extends javax.servlet.http.HttpServlet implements
javax.servlet.Servlet {
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=euc-kr");
PrintWriter out = response.getWriter();
request.setCharacterEncoding("euc-kr");
/*
//톰캣 플러그인을 사용하는 경우
String savePath = getServletContext().getRealPath("uploadFolder");
*/
// Dynamic Web Project 의 경우 : 절대 경로를 쓴다.
String savePath = "C:/eclipse/workspace/testProject/WebContent/uploadFolder";
int maxSize = 5 * 1024 * 1024; // 최대 업로드 파일 크기 5MB(메가)로 제한
try {
/*
한글 파일 업로드 하는 방법
CATALINA_HOME의 conf 폴더의 server.xml의
다음과 같은 엘레먼트에 URIEncoding="eur-kr" 를 추가 한다.
<Connector acceptCount="100" connectionTimeout="20000"
disableUploadTimeout="true" enableLookups="false" maxHttpHeaderSize="8192"
maxSpareThreads="75" maxThreads="150" minSpareThreads="25" port="8080"
redirectPort="8443" URIEncoding="eur-kr" />
*/
MultipartRequest multi = new MultipartRequest(request, savePath,
maxSize, "euc-kr", new DefaultFileRenamePolicy());
out.println("<html>");
out.println("<head><title>MultipartRequest fileUpload</title></head>");
out.println("<body>");
out.println("<pre>");
Enumeration params = multi.getParameterNames(); // 파라미터명 얻기
// 폼필드의 내용을 받기 위해서 반복문으로 필드의 엘레먼트를 받는다.
while (params.hasMoreElements()) {
String name = (String) params.nextElement();
String value = multi.getParameter(name);
out.println(name + " : " + value);
}
out.println("</pre>");
out.println("<h3>업로드된 파일에 대한 설명</h3>");
out.println("<pre>");
out.println("<table border=1>");
out.println("<tr>");
out.println("<td width=150>파일명</td>");
out.println("<td width=100>파일 크기</td>");
out.println("<td width=150>파일의 종류</td>");
out.println("<td width=150>파라미터명</td>");
out.println("</tr>");
Enumeration files = multi.getFileNames(); // 파일명 모두 얻기
// 업로드 파일의 정보를 받기 위해서 반복문으로 업로드 파일의 엘레먼트를 받는다.
while (files.hasMoreElements()) {
String name = (String) files.nextElement();
String fileName = multi.getFilesystemName(name); // 실제 업로드된 파일명
String type = multi.getContentType(name);
File file = multi.getFile(name);
out.println("<tr>");
out.println("<td>" + fileName + "</td>");
if (file != null) {
out.println("<td>" + file.length() + "</td>");
}
out.println("<td>" + type + "</td>");
out.println("<td>" + name + "</td></tr>");
}
out.println("</table>");
out.println("</pre>");
out.println("<h3>MultipartRequest fileUpload DownLoad List</h3>");
out.println("<pre>");
File dirFile = new File(savePath); // 업로드 폴더 얻기
File[] fileList = dirFile.listFiles(); // 현재 폴더의 모든 파일 리스트 얻기
// 반복문으로 다운로드 링크 걸어주기
for (int i = 0; i < fileList.length; i++) {
String fileName = fileList[i].getName();
out.println("<a href='/testProject/DownloadServlet?file="
+ fileName + "'>" + fileName + "</a><br>");
}
out.println("<pre>");
} catch (Exception e) {
out.print("Exception : " + e);
}
}
}
========================== DownloadServlet.java ================================
package util;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class DownloadServlet extends javax.servlet.http.HttpServlet implements
javax.servlet.Servlet {
public void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
/*
// 톰캣 플러그인을 사용하는 경우
String dir = getServletContext().getRealPath("WebContent/uploadFolder");
*/
String dir = "C:/eclipse/workspace/test_cos_servlet/WebContent/uploadFolder";
res.setContentType("euc-kr");
String filename = req.getParameter("file");
res.setContentType("application/octet;charset=euc-kr");
res.setHeader("Content-Disposition", "attachment;filename=" + filename);
/*
String mime = getServletContext().getMimeType( file );
if (mime == null)
mime = "application/octet-stream";
res.setContentType( mime );
res.setHeader("Content-Transfer-Encoding", "7bit");
if (req.getHeader("User-Agent").indexOf("MSIE 5.5") > -1) {
res.setHeader("Content-Disposition",
"filename=\"" + URLEncoder.encode( file, "UTF8" )+ "\";");
}else{
res.setHeader("Content-Disposition",
"attachment; filename=\"" + URLEncoder.encode( file, "UTF8" )+ "\";");
}
*/
// 자바 I/O 를 이용하여 다운로드
byte[] buffer = new byte[1024];
ServletOutputStream out = res.getOutputStream();
BufferedInputStream in = null;
try {
in = new BufferedInputStream(new FileInputStream(dir + "\\"
+ filename));
int n = 0;
while ((n = in.read(buffer, 0, 1024)) != -1) {
out.write(buffer, 0, n);
}
} catch (Exception e) {
out.println("Exception : " + e);
e.printStackTrace();
} finally {
if (in != null) try { in.close(); } catch(Exception e) { }
if (out != null) try { out.close(); } catch(Exception e) { }
}
}
}



