반응형

파일 업로드
   - 단순한 텍스트를 전송하는 것이 아닌 바이너리 형태의 파일을 업로드 합니다.
   - 자료실 형태의 폼 학습입니다.

1. 파일 업로드를 위한 기본적인 폼 형태
   - form태그 속성들 중 input type="file" 은 파일을 선택할 수 있는 창을 만듭니다.
   - form 태그의  method와 enctype을 지정합니다.]

   <form name = "formName" method="post" enctype="multipart/form-data">
   <input type = "file" name="selectfile">

   - 파일 선택 페이지 작성

    
<html>
<body>
<form name="frmName" method="post" enctype="multipart/form-data"
  action="ViewPage.jsp">
user<br>
<input type="text" name="user"><br>
title<br>
<input type="text" name="title"><br>
file<br>
<input type="file" name="uploadFile"><br>
<input type="submit" value="UPLOAD"><br>
</form>
</body>
</html>


   - 위에 페이지에서 폼을 전송할 때 request 객체로 파라미터의 값을 얻어낼수 없습니다.
   - enctype="multipart/form-data로 전송한 폼에 담겨진 파라미터들에 대한 값을 얻어내기 위해,
     파일 찾기로 파일을 서버상의 한 폴더에 업로드 하기 위해 특별한 컴포넌트 필요합니다.
   - www.servlets.com에서 제공하는 cos.jar파일은  필요한 컴포너트 제공합니다.
   - cos-05Nov2002.zip 파일을 다운로드후 압축해제합니다.



2. 파일을 업로드하고 폼 데이터를 분석하는 도구 cos.jar
   - lib폴더 밑의 cos.jar 파일 설정하기
      ★ c:\tomcat-5.0.19\common\lib    
    
   - 어플리케이션 폴더에 업로드 되는 파일들이 저장될 폴더를 만듭니다. 폴더 이름은 자유롭게 사용

    


2. 파일 업로드 및 폼 요소 처리를 위한 MultipartRequest 클래스

   - MultipartRequest의 생성자
    . 한글 인코딩, 업로드 파일 중복의 해결

     MultipartRequest multi = new MultiPartRequest(request, folderDirectory,1024*10,"euc-kr",
                                                   new DfaultFileRenamePolicy());

     . 이객체가 생성되면서 폼에서 지정한 파일이 서버상의 폴더에 저장됩니다.



   - getParameterNames()
     폼에서 전송한 파라미터들의 이름을 Enumeration타입으로 반환, input 태그중에서 file 속성이 아닌
     모든 파라미터들의 이름을 반환 합니다.

   - getParameter()
     파라미터의 이름을 인자로 받아서 그 파라미터의 값을 반환 합니다.

   - getFileNames()
     폼요소 중 file 속성으로 지정된 input태그의 이름을 Enumeration타입으로 반환 합니다.

     <input type="file" name="uploadfile"> 태그가 폼요소에 있다며 uploadfile이란 파라메터의 이름이
     담긴 Enumeration을 반환 합니다.

   - getFilesystemName()
     서버상에 실제로 업로드된 파일 이름을 String 타입으로 반환 합니다.
     파일명이 중복될 경우 파일명뒤에 filename1.xxx   filename2.xxx 식으로 변경된 이름 반환 합니다.

   - getOriginalFileName()
     사용자가 직접 지정한 파일명을 반환, 파일명이 변경되기 전의 파일명이 반환 됩니다.

   - getContentType()
     getContentType() 메소드는 업로드된 파일의 컨텐트 타입을 반환 합니다.

   - getFile()
     서버상에 업로드된 파일에 대한 파일 객체를 반환 합니다.



3. 폼데이터 분석 & 파일 업로드 페이지 구현

<%--
/**
  *  Upload file...
  *  jsp file name : FileUploadPage.jsp
  **/
--%>
<%@page contentType="text/html;charset=euc-kr"   %>
<%@page import="com.oreilly.servlet.MultipartRequest,
                      com.oreilly.servlet.multipart.DefaultFileRenamePolicy,
                      java.util.*,
                      java.io.*"
%>
<%
String realFolder = "";
String saveFolder = "filestorage";
String encType = "euc-kr";
int maxSize = 5*1024*1024;

ServletContext context = getServletContext();
realFolder = context.getRealPath(saveFolder);
//out.println("the realpath is : " + realFolder+"<br>");
try
{
   MultipartRequest multi = null;
   multi = new MultipartRequest( request,realFolder,maxSize,encType,new DefaultFileRenamePolicy());
   Enumeration params = multi.getParameterNames();
  
   while(params.hasMoreElements()){
      String name = (String)params.nextElement();
      String value = multi.getParameter(name);
      out.println(name + " = " + value +"<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);
      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());
         out.println("<br>");
      }
   }
}catch(IOException ioe){
System.out.println(ioe);
}catch(Exception ex){
System.out.println(ex);
}
%>


  

4. 여러개의 파일 업로드
          
FileSelectPage.jsp

<%@page contentType="text/html; charset=euc-kr" %>
<%!
public String getParam(HttpServletRequest request, String paramName){
  if(request.getParameter(paramName)!=null){
   return request.getParameter(paramName);
  }else{
   return "";
  }
}
%>
<%
request.setCharacterEncoding("euc-kr");
int filecounter = 0;
if(request.getParameter("addcnt")!=null){
  filecounter = Integer.parseInt(request.getParameter("addcnt"));
}
%>
<html>
<head>
<title>File Select Page</title>
<link href="style.css" rel="stylesheet" type="text/css">
<script language="JavaScript">
function inputValue(form1, param, form2, idx){
var paramValue = form1.elements[idx].value;
form2.elements[idx].value = paramValue;    
return;
}
function addFile(formName){
if(formName.addcnt.value==""){
  alert(" 입력할 파일 갯수를 입력하고 확인버튼을 눌러주세요" );
  formName.addcnt.focus();      
  return;
}
formName.submit();
}

function elementCheck(formName){
   paramIndex = 1;
   for(idx=0; idx<formName.elements.length; idx++){
      if(formName.elements[idx].type == "file"){
         if(formName.elements[idx].value==""){
         var message = paramIndex+" 번째 파일정보가 누락되었습니다.\n업로드할 파일을 선택해 주세요";
      alert(message);
   formName.elements[idx].focus();
   return;  
      }
      paramIndex++;
      }
   }
   formName.action = "FileInfoView.jsp";
   formName.submit();
}
</script>
</head>
<body topmargin="100">
<div align="center"><font color="#0000ff" size="2">
복수개의 파일의 업로드를 위하여 파일 갯수를 입력한 후<br>
확인 버튼을 눌러주세요!!!<br>
입력이 완료되면 DONE 버튼을 눌러주세요</font></div><br>
<form name="frmName1" method="post">
<table width="75%" border="1" align="center" cellpadding="1" cellspacing="1" bordercolor="#660000" bgcolor="#FFFF99">
<tr bgcolor="#FFCC00">
    <td width="10%"><div align="right">user</div></td>
    <td><input type="text" name="user" onkeyup="inputValue(this.form,user,frmName2,0)" value="<%=getParam(request, "user")%>"></td>
    <td width="10%"><div align="right">title</div></td>
    <td><input type="text" name="title" onkeyup="inputValue(this.form,title,frmName2,1)" value="<%=getParam(request, "title")%>"></td>
</tr>
<tr bgcolor="#FFCC00">
<td width="15%"><div align="right">Abstract</div></td>
<td width="50%" colspan="3">
<textarea name="abstract" cols="40" onkeyup="inputValue(this.form,abstract, frmName2,2)"><%=getParam(request,"abstract")%></textarea>
</td>
</tr>
<tr>
<td colspan="4"><div align="center">
<font size="-2">추가할 파일 수 입력</font>
<input type="Text" name="addcnt">
<input type="button" value=" 확인 " onclick="addFile(this.form)">
</div>
</td>
</tr>
</table>
</form>

<form name="frmName2" method="post" enctype="multipart/form-data">
<table width="75%" border="1" align="center" cellpadding="1" cellspacing="1" bordercolor="#660000" bgcolor="#FFFF99">
<tr bgcolor="#FFCC00">
<td width="40%">
<input type="hidden" name="txtUser" value="<%=getParam(request, "user")%>">
<input type="hidden" name="txtTitle" value="<%=getParam(request, "title")%>">
<input type="hidden" name="txtAbstract" value="<%=getParam(request,"abstract")%>">
<% for(int i=0; i<filecounter; i++){%>
<input type="File" size="50" name="selectFile<%=i%>"><br>  
<% }%>
</td>
<td><input type="Button" value="DONE" onclick="elementCheck(this.form)"></td>
</tr>
</table>
</form>
</body>
</html>





<<<<  FileInfoView.jsp

<%@page contentType="text/html;charset=euc-kr"   %>
<%@page import="com.oreilly.servlet.MultipartRequest,
                com.oreilly.servlet.multipart.DefaultFileRenamePolicy,
                java.util.*,
                java.io.*"          
%>
<%
String realFolder = "";
String saveFolder = "filestorage";
String encType = "euc-kr";
int maxSize = 10*1024*1024;//10M

ServletContext context = getServletContext();
realFolder = context.getRealPath(saveFolder);
ArrayList saveFiles = new ArrayList();
ArrayList origFiles = new ArrayList();

String paramUser = "";
String paramTitle= "";
String paramAbstract = "";


try
{
MultipartRequest multi = new MultipartRequest( request,realFolder,maxSize,encType,new DefaultFileRenamePolicy());
              
paramUser = multi.getParameter("txtUser");
paramTitle = multi.getParameter("txtTitle");
paramAbstract = multi.getParameter("txtAbstract");

Enumeration files = multi.getFileNames();
while(files.hasMoreElements()){
    String name = (String)files.nextElement();
    saveFiles.add(multi.getFilesystemName(name));
    origFiles.add(multi.getOriginalFileName(name));
}
%>
<html>
<head>
<title>File Info Page</title>
<link href="style.css" rel="stylesheet" type="text/css">
</head>
<body>
<table width="75%" border="1" align="center" cellpadding="1" cellspacing="1" bordercolor="#660000" bgcolor="#FFFF99">
<tr>
    <td width="10%" bgcolor="#FFCC00"><div align="right"><strong>user</strong></div></td>
    <td width="30%"><%= paramUser %></td>
    <td width="10%" bgcolor="#FFCC00"><div align="right"><strong>title</strong></div></td>
    <td width="30%"><%= paramTitle %></td>
</tr>
<tr>
<td width="10%" bgcolor="#FFCC00"><div align="right"><strong>Abstract</strong></div></td>
<td width="50%" colspan="3">
  <textarea cols="50" rows="5" disabled><%= paramAbstract %></textarea>
</td>
</tr>
<tr><td colspan="4" bgcolor="#ffffff"> </td></tr>
<tr>
<td colspan="4"><strong>업로드된 파일들입니다.</strong></td>
</tr>
<%for(int i=0; i<saveFiles.size();i++){%>
<tr bgcolor="#FFCC00">
<td colspan="4">
<a href="../<%=saveFolder+"/"+saveFiles.get(i)%>"><strong><%=origFiles.get(i)%></strong></a>
</td>
</tr>
<%}%>
</table>
</body>
</html>
<%
}catch(IOException ioe){
System.out.println(ioe);
}catch(Exception ex){
System.out.println(ex);
}
%>
반응형

'WEB > CGI' 카테고리의 다른 글

csv 파일 서버 저장 JSP  (0) 2010.10.21
*OutputStream 한글 인코딩 처리  (0) 2010.10.21
PHP 파일의 확장자 분리하기  (0) 2010.10.21
E-mail programming 관련  (0) 2010.10.20
JSP에서 한글인코딩이 안될때  (0) 2010.10.20

+ Recent posts