Strtus2 에서는 client가 form에서 보내주는 데이타를 bean으로 받으면 bean에 file을 써주기만 하면 그냥 데이터가 들어와 있다! 처리해줘야 할 일은 중복을 제거해 주어야 한다. commons에서 제시하고 있는 FileUpload, IO를 참조해서 upload를 수행하기 때문에 commons의 FileUpload는 중복을 해결하기 위한 정책이 없다. 그래서 이것을 처리해 주어야 한다.
 그리고 commons의 FileUpload는 client가 업로드한 파일을 template으로 파일을 주고, 저장한다. 그런데 template는 실제 올린 이름과 완전히 다른 이름으로 저장되어있다. 이 부분도 처리해 주어야 한다.

순서 : 다운로드에 필요한 library 파일 다운로드 --> jsp 페이지 만들기 --> FormBean Class 만들기 --> DTO  Class 만들기 --> DB에 데이타를 넣기 위한 DAO 설정 및 iBatis 설정(UploadSqlMap.xml, SQLManager.java, SqlMapConfig.xml) --> pacakge_ko.properties 설정 --> upload.xml --> UploadIndexAction Class 만들기
--> UploadUtil Class 만들기 --> UploadMultiAction Class 만들기


1. 파입 업로드에 필요한 library 파일 다운로드 하기.
http://commons.apache.org/ 에서 IO, FileUpload 에서 library 파일을 다운로드 하여 lib 폴더에 추가한다.

2. jsp 페이지 만들기.

<%@ page contentType="text/html;charset=euc-kr"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:bean id="bean" name="com.myhome.upload.beans.UploadFormBean"/>
<html>
  <body>
    <center><br><br>
    <h3><b><s:text name="register.title" /></b></h3><!-- 번들 설정 해서 사용 : package_ko.properites -->
    <form method="post" action="register.action" enctype="multipart/form-data">
<!-- fileupload는 form에서 multipart로 나간다고 반드시 명시해줘야 한다. enctype="multipart/form-data" -->
     <table border=0 cellpadding=0 cellspacing=1 bgcolor="#000000">
       <tr height=30 bgcolor="#ffffff">
         <td width=100 align="right">
           <b><s:text name="register.name" /></b>&nbsp;
         </td>
         <td width=300 align="left">&nbsp;
            <input type="text" name="bean.name">
.......................... 생략..................................................................

3. FormBean Class 만들기.

package com.myhome.upload.beans;
import java.io.File;
public class UploadFormBean {
 
 /*form parameter*/
 private int num;
 private String name;
 private String sex;
 private String tel;
 
 /*file upload property*/
// 파일을 올릴 때, 네개의 property 는 반드시 있어야 한다. 배열로 잡으면 다중 파일을 받을 수 있다.

 private File file;  
 private String fileFileName; 
 private long fileFileSize;
 private String fileContentType; // 어떤 file type 인지 알려 준다.(text, imag 등...)
................. getter, setter 부분 생략.................................................

여기서 주의해야 할 점은 이름을 정할 때, private File file; 의 file 이름과 나머지 아래 세 property의 file의 접두사가 일치해야 한다는 것이다. 그리고 file 다음에 오는 문자는 대문자가 와야 한다. ex) file -> fileFile -> fileFileName(fileFileSize, fileContentType) 이런식으로 이름을 만들어 주어야 한다.

3. DTO 만들기.(파일 참조)

4. DAO 만들기.(파일 참조)

5. iBatis 설정.(파일 참조)
쿼리를 수행할 UploadSqlMap.xml 만들고, SQLManager.java, SqlMapConfig.xml 만들기

6. 번들을 사용하기 위하 package.properties 만들기

 spring에서는 번들을 일일이 설정해줘야 사용할 수 있다. 하지만 struts2에서는 번들을 사용할 때, 패키지 안에 package.properties 파일만 놓아주면 자동 인식(번들 파일들이)이 된다. 전체에 적용할려면 classes에 packages.properties, global.properties(공동으로 메세지를 정의할 때) 만들면 된다.
 
 1) 메모장에서 아래 내용을 입력한다.
# upload project message bundle
# file name ; package.properties
register.title=Struts2 File Upload (Register)
register.name=성 명
register.sex=성 별
register.tel=연락처
register.file=첨부
error.name=성명은 필수 입력항목입니다.
error.name.length=잘못 입력된 성명입니다.
error.tel=연락처를 입력하세요!!!
error.tel.length=사용할 수 없는 번호 입니다.
# native2ascii -encoding euc-kr package.properties package_ko.properties

#은 주석이다.

package.proeerties 파일 이름으로 upload package 가 이는 곳에다 저장한다.(파일 형식에서 모든 파일 선택 후) ex.C:\workspace\struts2\src\com\myhome\upload 여디가 저장

2) 콘솔 창에서 upload 폴더가 있는가 있는 곳으로 이동한다. ex)C:\workspace\struts2\src\com\myhome\upload 


 패스가 잡혀 있지 않을 경우 패스를 잡아주어야 한다.(자신의 Java SDK를 설치한 경로로)

콘솔 창에서 아래와 같이 입력한다.
set path=%path%;C:\Program Files\Java\jdk1.6.0_12\bin


그런다음 다음과 같이 입력한다.
native2ascii -encoding euc-kr package.properties package_ko.properties
native2ascii [-encoding] [코드값] [원시파일] [목적파일] 순으로 작성하며 euc-kr 타입으려 변경한다.

그러면 폴더 안에 package_ko.properties 파일이 생성된것을 확인 할 수 있다.

# upload project message bundle
# file name ; package.properties
register.title=Struts2 File Upload (Register)
register.name=\uc131 \uba85
register.sex=\uc131 \ubcc4
register.tel=\uc5f0\ub77d\ucc98
register.file=\ucca8\ubd80
error.name=\uc131\uba85\uc740 \ud544\uc218 \uc785\ub825\ud56d\ubaa9\uc785\ub2c8\ub2e4.
error.name.length=\uc798\ubabb \uc785\ub825\ub41c \uc131\uba85\uc785\ub2c8\ub2e4.
error.tel=\uc5f0\ub77d\ucc98\ub97c \uc785\ub825\ud558\uc138\uc694!!!
error.tel.length=\uc0ac\uc6a9\ud560 \uc218 \uc5c6\ub294 \ubc88\ud638 \uc785\ub2c8\ub2e4.
# native2ascii -encoding euc-kr package.properties package_ko.properties

이렇게 인코딩 되어 있는것을 확인 할 수 있다.

7. upload.xml 을 만들고 struts.xml 에 include 한다.

8. UploadIndexAction Class 만들고,
 index.jsp <%response.sendRedirect("upload/index.action");%> 설정.

9. UploadUtil Class 만들기

package com.myhome.upload.util;
public final class UploadUtil {
 public static final String SAVE = "D://Java_webprogramimng_2/Java Web2/edu/upload/"; //실제 파일이 저장될 위치
 
 public static final long SIZE = 1024*1024*20; //파일 사이즈 20M 로 제한.
}

10. UploadMultiAction Class 만들기

package com.myhome.upload.actions;
import com.myhome.upload.util.UploadUtil;
import com.myhome.upload.dao.UploadDAO;
import com.myhome.upload.dto.UploadDTO;
import com.myhome.upload.beans.UploadFormBean;
import com.opensymphony.xwork2.ActionSupport;
/*file spec*/
import java.io.File;
import org.apache.commons.io.FileUtils;
/*log4j*/
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/*commons bean utils*/
import org.apache.commons.beanutils.BeanUtils; //폼에 있는 값을 DTO로 보내기 위해
public class UploadMultiAction extends ActionSupport{
 
 //Log 셋팅
 public static final Log log = LogFactory.getLog(UploadMultiAction.class);
 
 private UploadFormBean bean;
 private UploadDTO dto;
 
 /**
  * 등록부분
  */
 public String register() throws Exception{
  dto = new UploadDTO();
  BeanUtils.copyProperties(dto, bean);
  if(bean.getFile() != null){
   upload();
  }else{
   dto.setFileName("");
   dto.setFileSize(0L);
  }
  
  new UploadDAO().insert(dto);
  
  return SUCCESS;
 }
 
 protected void upload() throws Exception{
  File file = new File(UploadUtil.SAVE + bean.getFileFileName());
  
//bean이 참조하고 있는 파일을 실제 파일로 얻어온다
  log.info("template file : " + bean.getFile().toString());
  log.info("original file : " + file.toString());
  FileUtils.copyFile(bean.getFile(), file); //bean에 있는 파일은 template 파일이다. templete의 파일을 실제파일로 복사여 폴더에 저장한다.
  FileUtils.forceDelete(bean.getFile());
   //templete에 있는 파일을 삭제한다. 계속 쌓아 두기 때문에 삭제 해줘야 한다.
  
  //DB에 저장하기 위해 빈으로 부터 파일과 크기를 받는다  
  dto.setFileName(file.getName()); 
  dto.setFileSize(file.length());
  
 }
 public UploadFormBean getBean() {
  return bean;
 }
 public void setBean(UploadFormBean bean) {
  this.bean = bean;
 }
 
 public UploadDTO getDto(){
  return dto;
 }
}

자세한 내용은 Struts2 에서 upload & download 하기 3 에서 파일을 참조 한다.

struts2 를 이용한 Upload 끝!

+ Recent posts