1. 이전 페이지에서 enctype="multipart/form-data"로 넘긴다.
2. ---------------------------파일 업로드 및 DB 저장----------------------------------
<%
String realFolder=null;
String saveFolder="upload";
// ServletContext scontext = getServletContext();
// realFolder=scontext.getRealPath(saveFolder); 또는
realFolder = application.getRealPath("/") + saveFolder;
// 파일의 절대 경로를 지정해준다. 예)D:\test\upload
String encType="euc-kr";
int maxSize=5*1024*1024;
out.println("the realpath is:"+realFolder+"<br>");
try{
MultipartRequest multi = null;
/***MultipartRequest 객체를 생성함과 동시에 파일 업로드
multi = new MultipartRequest(request, realFolder, maxSize, encType,
new FileUploadRename(userID));
// -->인자를 new DefaultFileRenamePolicy()로 할 경우
파일 중복시 파일명뒤에 1씩증가하면서 붙음
new FileUploadRename("하하")은
FileRenamePolicy 클래스를 상속받아 파일명을 임의대로
재설정 해주기 위한 인자
String value= null;
String original=null;
String filename=null;
/********주석했슴
Enumeration<String> params = multi.getParameterNames();
// -->enctype="multipart/form-data"넘어오는 파라미터를 순서대로 담는다.
(주의: submit의 value도 포함!!)
while(params.hasMoreElements()){
String name=(String)params.nextElement();
value=multi.getParameter(name);
}********/
value = multi.getParameter("name"); //input type이 file이아닌 값들을
지정해서 담는다.
Enumeration files = multi.getFileNames();
//넘오오는 파일주소값을 순서대로 담는다.
while(files.hasMoreElements()){
String name=(String)files.nextElement();
filename=multi.getFilesystemName(name); //
original = multi.getOriginalFileName(name); //실제 넘어온 파일 이름
String type = multi.getContentType(name); //실제 저장된 파일의 확장자
File f = multi.getFile(name); //실제 파일은 담는다.
out.println("파라미터 이름:" +name+"<br>");
out.println("실제 파일 이름:" +original+"<br>");
out.println("저장된 파일 이름:" +filename+"<br>");
out.println("파일 타입:" +type+"<br>");
if(f!=null)
out.println("크기:" + f.length()+"<br>");
}
new DB().insertData(value, filename); //DB에 저장
}catch(IOException ie){
ie.printStackTrace();
}catch(Exception ex){
ex.printStackTrace();
}
%>
--------new FileUploadRename(userID)-----------
//id+현재시간으로 파일이름을 바꾼다.
public class FileUploadRename implements FileRenamePolicy {
private String userId;
public FileUploadRename(){}
public FileUploadRename(String userId){
this.userId = userId;
}
public File rename(File f) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");
Date nowdate = new Date();
String dateString = formatter.format(nowdate);
String name = f.getName();
String ext = null;
int dot = name.lastIndexOf(".");
if (dot != -1) {
ext = name.substring(dot); // includes "."
}
else {
ext = "";
}
int count = 0;
do {
count++;
String newName = userId + "_" + dateString + count + ext;
f = new File(f.getParent(), newName);
} while (!createNewFile(f) && count < 9999);
return f;
}
private boolean createNewFile(File f) {
try {
return f.createNewFile();
}
catch (IOException ignored) {
return false;
}
}
}
3. list 페이지
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ page import = "DAO.DB, java.util.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
<script language="javascript">
<!--
function go_down(f){
location.href = "down.jsp?file="+f;
}
//-->
</script>
</head>
<body>
<%
DB db = new DB();
List list = db.getData();
%>
<table border width="600">
<%if(list!=null && list.size()>0){
for(int i=0; i<list.size(); i++){
ArrayList alist = (ArrayList)list.get(i);%>
<tr>
<td>이름 </td>
<td><%=alist.get(0) %></td>
<td>파일</td>
<td><a href="javascript:go_down('<%=alist.get(1)%>')"><%=alist.get(1)%></a></td>
</tr>
<%}
}else{ %>
<tr>
값이 없습니다.
</tr>
<%} %>
</table>
</body>
</html>
4. 다운로드 페이지
!!!!!!!!! 다운시 주의 : 다운로드 페이지에서 한번 더 페이지를 만들기 때문에( response.setHeader
()) 프레임셋 안에서 이동시 target을 잘줘야 한다.
(예: <form name="fileDownFrm" action="fileDownProc.jsp" method="post" target="_top")
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ page import= "java.io.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<% String filenm = new String(request.getParameter("file").getBytes("ISO-8859-1"), "euc-kr");
String saveFolder="upload/"+filenm;
System.out.println("saveFolder="+saveFolder);
//ServletContext scontext = getServletContext();
//String realpath = scontext.getRealPath(saveFolder); 또는
String realpath = application.getRealPath("/") + saveFolder;
FileInputStream fin = null;
ServletOutputStream fout = null;
File f = null;
String client = request.getHeader("User-Agent");
try {
out.clear();
out=pageContext.pushBody();
/*중요!!
jsp페이지에서 원래 ServletOutputStream(또는 OutputStream)을 사용하면 안된다.
servlet 페이지에서 사용해야 함
부득히 사용할 경우 위의 2줄을 꼭 추가!!
이유는 다른 포스트에서 설명..
또는
PrintWriter w = response.getWriter(); 객체 생성하고
사용
*/
f = new File(realpath);
String tmp = new String(f.getName().getBytes("euc-kr"), "ISO-8859-1");
if (f == null || f.exists() == false) {
out.println("<script>\nalert('파일이 없거나 읽을수 없습니다.');\n</script>");
} else{
if(client.indexOf("MSIE 5.5") != -1){ //익스플러로 6.0버전 이하라면
response.setHeader("Content-Type", "doesn/matter; charset=euc-kr");
response.setHeader("Content-Disposition", "attachment; filename="+tmp);
}else{ //익스플러로가 6.0버전 이상이라면
response.reset();
response.setContentType("application/octet-stream; charset=euc-kr");
//또는 response.setHeader("Content-Type", "application/octet-stream;
charset=euc-kr");
response.setHeader("Content-Disposition", "attachment; filename=" + tmp);
}
fin = new FileInputStream(f);
fout = response.getOutputStream();
byte b[] = new byte[(int) f.length()];
int leng = 0;
while ((leng = fin.read(b)) > 0) {
fout.write(b, 0, leng);
}
}
} catch (Exception e) {
} finally {
if (fin != null)
fin.close();
if (fout != null)
fout.close();
}
%>
</body>
</html>