fel1s
25
2017-11-29 02:51:53 작성 2017-11-29 12:17:01 수정됨
3
7470

JSP multiple 속성을 이용한 다중 파일 업로드시 파일명 가져오기




    <fieldset>
        <input id="files-upload" type="file" name="filename[]" multiple><br>
    </fieldset>


현재 프로그램을 짜고 있는 중인데

fileUpload.jsp에서 파일 업로드하면 viewUploadResult.jsp 에서 업로드된 파일명, 링크를 보여주려고 합니다.

근데 문제가 있는게 multiple 속성을 이용해서 업로드하면 실제 경로에 파일은 업로드가 잘 되는데

파일명을 읽어오는게 잘 안되네요..


보니깐 마지막 파일명만 가져옵니다..

MultipartRequest 객체를 이용해 multi.getFileNames()를 해서 보면 마지막 파일 하나만 들어가있습니다.

어떻게 해결해야할까요...ㅠㅠㅠ



아래는 fileUpload.jsp와 viewUploadResult.jsp  파일 코드 전체입니다.



<fileUpload.jsp>

<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="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 filecount=3;
%>
<jsp:useBean id="dataBean" class="bean.DataBean" scope="page" />
<jsp:setProperty name="dataBean" property="*"  />

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>JSP 웹프로그래밍 - 파일업로드 프로그램</title>
<link href="style.css" rel="stylesheet" type="text/css">
<script language="JavaScript">
function inputValue(form1, form2){
 	var strarr = new Array;
 	strarr = form1.elements[idx].value.split(", ");
 	var filecount = strarr.length;
 	for(var i=0; i<filecount; i++){
 		form2.elements[i].value = strarr[i];
 	}
}
function fileCheck(formName){
   for(idx=0; idx<formName.elements.length; idx++){
      if(formName.elements[idx].type == "file"){
         if(formName.elements[idx].value==""){
           var message = "선택된 파일이 없습니다.\n업로드할 파일을 선택해 주세요";
            alert(message);
            formName.elements[idx].focus();
            return;
         }
     }
   }

   formName.action = "viewUploadResult.jsp";
   formName.submit();
}
</script>
</head>


<form  name="form_board" method="post" enctype="multipart/form-data">
<table width="520" cellpadding="2" cellspacing="1" bgcolor="#CCCCCC" align=center>
<tr>
  <td bgcolor="#F5F5F5" align="center" width="100">이름</td>
  <td bgcolor="#FFFFFF" width="420">
  <input type="text" name="user" size="20"></td>
</tr>
<tr>
  <td bgcolor="#F5F5F5" align="center">제목</td>
  <td bgcolor="#FFFFFF">
  <input type="text" name="title" size="57"></td>
</tr>
<tr>
  <td bgcolor="#F5F5F5" align="center">내용</td>
  <td bgcolor="#FFFFFF">
  <textarea name="content" cols="55" rows="10"></textarea>
  </td>
</tr>
<tr>
  <td bgcolor="#F5F5F5" align="center">첨부파일</td>
  <td bgcolor="#FFFFFF">
  <form id="files">
    <fieldset>
        <input id="files-upload" type="file" name="filename[]" multiple><br>
    </fieldset>
    </form>
  </td>
</tr>
</table>
</form>

<form name="form_upload" method="post" enctype="multipart/form-data">
<table width="520" cellpadding="2" cellspacing="1" bgcolor="#FFFFFF" align=center>
<tr>
   <td align="center">
     <input type="button" value="작성" onclick="fileCheck(form_board)">
   </td>
</tr>
</table>
</form>

</body>
</html>


<viewUploadResult.jsp>

<%@page contentType="text/html;charset=euc-kr"%>
<%@page import="com.oreilly.servlet.MultipartRequest,
                com.oreilly.servlet.multipart.DefaultFileRenamePolicy,
                java.util.*,
                java.io.*"%>
<%
request.setCharacterEncoding("euc-kr");
%>
<jsp:useBean id="dataBean" class="bean.DataBean" scope="page" />
<jsp:setProperty name="dataBean" property="*"  />

<%
String saveFolder = "D:/Platform/eclipse-workspace/myapp/WebContent/filedata";
String encType = "euc-kr";
int maxSize = 100*1024*1024;//파일 용량 제한 100Mb

ServletContext context = getServletContext();
ArrayList saveFiles = new ArrayList();
ArrayList origFiles = new ArrayList();

String paramUser = "";
String paramTitle= "";
String paramContent = "";

try{
   MultipartRequest  multi = new MultipartRequest( request,saveFolder,maxSize,encType,new DefaultFileRenamePolicy());

   dataBean.setUser(multi.getParameter("user"));
   dataBean.setTitle(multi.getParameter("title"));
   dataBean.setContent(multi.getParameter("content"));
   
   paramUser = dataBean.getUser();
   paramTitle = dataBean.getTitle();
   paramContent = dataBean.getContent();
   
   Enumeration<String> files = multi.getFileNames();
   while(files.hasMoreElements()){
      String name = 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>content</strong></div></td>
	<td width="50%" colspan="3">
		<textarea cols="50" rows="5" disabled><%=paramContent %></textarea>	
	</td>
</tr>
<tr><td colspan="4" bgcolor="#ffffff">&nbsp;</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="<%="./filedata/"+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);
}
%>

1
  • 답변 3

  • 수평선
    1k
    2017-11-29 10:22:30

    오렐리의 라이브러리를 사용하면 multiple 기능을 사용할 수 없습니다.(input name값이 모두 다르다면 가능합니다.)

    이유는 라이브러리 내부에서 map방식으로 input name을 키로 사용하기 때문입니다.

    아파치 라이브러리를 사용하시면 가능합니다.

    https://commons.apache.org/proper/commons-fileupload/using.html

  • madlife
    2k
    2017-11-29 10:43:04

    배워갑니당 수평선

    오렐리의 라이브러리가 뭔가요?

  • 수평선
    1k
    2017-11-29 11:23:55
    <%@page import="com.oreilly.servlet.MultipartRequest,
                    com.oreilly.servlet.multipart.DefaultFileRenamePolicy,
                    java.util.*,
                    java.io.*"%>
    위의 oreilly 를 말하는거에요..
  • 로그인을 하시면 답변을 등록할 수 있습니다.