JSP/Apache Upload 04

Apache Upload 04

Soul-Learner 2008. 1. 24. 18:00

파일을 업로드한 후에 보여지는 pdsList.jsp 에서는 데이터베이스에서 가져온 업로드 파일정보를 보여주고 있는데, 이용자가 파일명을 클릭해서 파일을 다운로드 할 수 있도록 DownloadServlet 을 연결한다.

pdsList.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"%>
<%@ page import="java.util.*" %>
<%@ page import="upload.FileInfo"%>

<jsp:useBean id="pdsDAO" class="upload.PdsDAO" scope="session"/>
<html>
<head>
<title>PDS List</title>
<style type="text/css">
TABLE{
 font-size:65%;
 text-decoration:none;
}
A{
 text-decoration:none;
}
</style>
</head>
<body><p><center>
자료실 목록
<hr width=70%><p>
<table border=1 cellspacing=0 width=600>
<tr><th>번호</th><th>작성자</th><th>설 명</th><th>파일명</th><th>날짜</th></tr>
<%
 Vector<FileInfo> v = pdsDAO.getList();
 String bgColor=null;
 for(int i=0;i<v.size();i++) {
  bgColor = i%2==0 ? "#FFFFCC" : "white";
 %>
  <tr bgcolor=<%=bgColor%>><td><%=v.get(i).getNum()%> </td><td><%=v.get(i).getName() %></td>
  <td><%=v.get(i).getDescr()%></td>
  <td><a href="DownloadServlet?file=<%=v.get(i).getFileName()%>"><%=v.get(i).getFileName()%></a></td>
  <td><%=v.get(i).getDate()%></td></tr>
<%}
%>
</table>
</center>
</body>
</html>


DownloadServlet.java

package upload;

import java.io.FileInputStream;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


 public class DownloadServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {

 protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  response.setContentType("application/octet-stream;charset=KSC5601");
   String fileName = request.getParameter("file");
   //아래처럼 attachment 를 사용하면 브라우저는 무조건 다운로드 창을 띄우고 파일명을 보여준다.
   response.setHeader("Content-Disposition", "attachment;filename="+fileName+";");

   ServletOutputStream sos = null;
   try{
    sos = response.getOutputStream();
   }catch(Exception e){e.printStackTrace();}

   //다음과 같이 스트림을 열고 브라우저에 바이트 데이터를 전송해주면 된다.
   FileInputStream fio = null;
   byte[] buf = new byte[1024];
   fileName = new String(fileName.getBytes("8859_1"),"KSC5601");
   File inFile = new File("D:/upload/"+fileName);
   byte[] buf = null;
   if(inFile.exists()) {
    int len = (int)inFile.length();
    buf = new byte[len];
   }
   fio = new FileInputStream("D:/upload/"+fileName);
   fio.read(buf);
   sos.write(buf);
   sos.flush();
   fio.close();
   sos.close();

 }        
}