- 이 문서는 구루비에서 작성하였습니다.
- 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 출처 : http://wiki.gurubee.net/pages/viewpage.action?pageId=26741265&
- 구루비 지식창고의 모든 문서는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.
Multiple file upload 적용
form.jsp 수정
- form.jsp에 enctype="multipart/form-data"를 추가한다.
- 파일을 첨부하는 filename 폼 태그도 추가하였다.
/WEB-INF/pages/emp/form.jsp
<%@ page language="java" isELIgnored="false" contentType="text/html; charset=UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ko"> <head> <meta http-equiv="Content-type" content="text/html; charset=UTF-8"> <style> .error { color: #ff0000; } .errorblock{ color: #000; background-color: #ffEEEE; border: 3px solid #ff0000; padding:8px; margin:16px; } </style> <script type="text/javascript" language="JavaScript"> function showMessage(msg){ if(msg != ''){ alert(msg); } } function list(){ location.href="/emp/list"; } </script> </head> <body > <form:form commandName="emp" name="form" method="post" enctype="multipart/form-data" action="/emp/register"> <h2> 사원정보 등록 화면 </h2> <table width="280" border="0"> <tr> <td align="left"> empno : </td> <td> <input type="text" id="empno" name="empno" value="${emp.empno}" maxlength="20" size="20"/> <br><form:errors path="empno" cssClass="error" /> </td> </tr> <tr> <td align="left"> ename : </td> <td> <input type="text" id="ename" name="ename" value="${emp.ename}" maxlength="20" size="20"/> <br><form:errors path="ename" cssClass="error" /> </td> </tr> <tr> <td align="left"> job : </td> <td><input type="text" id="job" name="job" value="${emp.job}" maxlength="20" size="20"/></td> </tr> <tr> <td align="left"> sal : </td> <td> <input type="text" id="sal" name="sal" value="${emp.sal}" maxlength="20" size="20"/> <br><form:errors path="sal" cssClass="error" /> </td> </tr> <tr> <td align="left"> deptno : </td> <td> <select name="deptno"> <option value="10" <c:if test="${emp.deptno == 10}">selected</c:if>>10</option> <option value="20" <c:if test="${emp.deptno == 20}">selected</c:if>>20</option> <option value="30" <c:if test="${emp.deptno == 30}">selected</c:if>>30</option> </select> </td> </tr> <tr> <td align="left"> 첨부파일 </td> <td> <p><input type="file" name="filename" id="filename1" size="35" /></p> <p><input type="file" name="filename" id="filename2" size="35" /></p> <p><input type="file" name="filename" id="filename3" size="35" /></p> </td> </tr> <tr height="10"><td></td></tr> <tr> <td align="center" colspan="2"> <input type="submit" value="저장" /> <input type="button" value="취소" onclick="list()"/> </td> </tr> </table> </form:form> </body> </html>
Emp.java 수정
- CommonsMultipartFile을 필드로 선언하고 getter/setter를 추가한다.
- 필드명을 form.jsp 파일의 type=file의 name과 동일하게 지정한다.
com.oracleclub.study.mvc.model.Emp.java
package com.oracleclub.study.mvc.model; import java.util.Date; import org.apache.commons.lang.builder.ToStringBuilder; import org.apache.commons.lang.builder.ToStringStyle; import org.springframework.web.multipart.commons.CommonsMultipartFile; /** * * emp 테이블 모델객체 * * @author : oramaster * */ public class Emp { private int empno; private int mgr; private int sal; private int deptno; private String ename; private String job; private Date hiredate; private CommonsMultipartFile[] filename; public CommonsMultipartFile[] getFilename() { return filename; } public void setFilename(CommonsMultipartFile[] filename) { this.filename = filename; } public Date getHiredate() { return hiredate; } public void setHiredate(Date hiredate) { this.hiredate = hiredate; } public int getEmpno() { return empno; } public void setEmpno(int empno) { this.empno = empno; } public int getMgr() { return mgr; } public void setMgr(int mgr) { this.mgr = mgr; } public int getSal() { return sal; } public void setSal(int sal) { this.sal = sal; } public String getEname() { return ename; } public void setEname(String ename) { this.ename = ename; } public String getJob() { return job; } public void setJob(String job) { this.job = job; } public int getDeptno() { return deptno; } public void setDeptno(int deptno) { this.deptno = deptno; } public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE); } }
mvc-dispatcher-servlet.xml 파일 설정 변경
- 파일을 업로드 하기 위해서 CommonsMultipartResolver를 추가한다.
- 파일경로를 @Value를 이용해서 config.properties 파일에서 읽기 위해서 PropertyPlaceholderConfigurer를 추가한다.
/WEB-INF/mvc-dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:security="http://www.springframework.org/schema/security" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd"> <context:component-scan base-package="com.oracleclub.study" > <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/> </context:component-scan> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" > <property name="prefix"> <value>/WEB-INF/pages/</value> </property> <property name="suffix"> <value>.jsp</value> </property> <property name="order" value="0" /> </bean> <!-- Spring FileUpload 처리 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- one of the properties available; the maximum file size in bytes --> <property name="maxUploadSize" value="1000000"/> </bean> <!-- config.properties 파일 로딩 (파일업로드 경로등의 환경설정) --> <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:config.properties" /> </bean> </beans>
config.properties 파일 생성
- /src/resources/config.properties 파일을 생성한다.
/src/resources/config.properties
uploadPath = ${uploadPath}
FileUpload 파일 경로 설정
- build-local.filter, build-release.filter 파일에 uploadPath경로를 수정한다.
- Project를 clean하여 재 컴파일 한다.
/filter/build-local.filter
uploadPath = C:/stsworkspace/spring-project/upload
EmpRegisterController.java 수정
- 사원정보 등록을 처리하는 EmpRegisterController클래스의 register 메소드에 파일업로드 부분을 추가한다.
- InitializingBean을 implements하여 afterPropertiesSet 메소드를 구현한다.
- 서버 startup시 업로드 경로가 있는지 체크하고, 없으면 경로를 생성한다.
com.oracleclub.study.mvc.controller.EmpRegisterController.java
package com.oracleclub.study.mvc.controller; import java.io.BufferedInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.Resource; import org.springframework.stereotype.Controller; import org.springframework.util.Assert; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.multipart.commons.CommonsMultipartFile; import org.springframework.web.servlet.ModelAndView; import com.oracleclub.study.mvc.model.Emp; /** * 사원정보 저장을 처리 * * @author : gurubee * */ @Controller @RequestMapping(value = "/emp") public class EmpRegisterController implements InitializingBean { private static final Log LOG = LogFactory.getLog(EmpRegisterController.class); /** * 파일을 저장 할 경로 */ @Value("file:${uploadPath}") private Resource uploadPath; @RequestMapping(value = "/form", method = RequestMethod.GET) public String form() { return "emp/form"; } @RequestMapping(value = "/register", method = RequestMethod.POST) public ModelAndView register(@ModelAttribute Emp emp) { LOG.debug(" #### 사원정보 : " + emp); // 파일업로드 if (emp.getFilename() != null) { writeFile(emp.getFilename()); } // DB저장하고 // View 설정 ModelAndView mv = new ModelAndView(); mv.setViewName("emp/view"); return mv; } /** * 파일 업로드 처리 * * @param multipartFiles */ private void writeFile(CommonsMultipartFile[] multipartFiles) { OutputStream out = null; try { for (CommonsMultipartFile multipartFile : multipartFiles) { out = new FileOutputStream(uploadPath.getFile().getAbsolutePath() + "/" + multipartFile.getOriginalFilename()); BufferedInputStream bis = new BufferedInputStream(multipartFile.getInputStream()); byte[] buffer = new byte[8106]; int read; while ((read = bis.read(buffer)) > 0) { out.write(buffer, 0, read); } IOUtils.closeQuietly(out); } } catch (IOException ioe) { LOG.error(ioe); } finally { IOUtils.closeQuietly(out); } } @Override public void afterPropertiesSet() throws Exception { Assert.notNull(uploadPath, "FileUpload Path must be defined!"); LOG.debug(" ######### uploadPath : " + uploadPath.getFile().getAbsolutePath()); // 디렉토리가 존재하지 않는다면, 디렉토리를 만든다. if (!uploadPath.getFile().exists()) { uploadPath.getFile().mkdirs(); } } }
문서정보
- 이 문서는 구루비에서 작성하였습니다.
- 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 출처 : http://wiki.gurubee.net/pages/viewpage.action?pageId=26741265&
- 구루비 지식창고의 모든 문서는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.