오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(신입사원채용추료교육, 오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷)
이번에는 fileUpload 인터셉터를 이용하여 실제 파일을 업로드 하는 간단한 응용 프로그램을 작성해 보자. (이전 강좌까지 배웠던 모든 부분을 포함한 예제이다.)
필요한 jar 파일은 다음과 같다.
- commons-fileupload-1.2.1
- commons-io-1.4
- commons-logging-1.0.4
- freemarker-2.3.8
- ognl-2.6.11
- struts2-core-2.0.14
- xwork-2.0.7
이클립스에서 Tomcat 프로젝트 interceptor를 만든 후 아래와 같이 작업을 하자.
1. Action 클래스
[FileUploadAction.java]
package upload.action;
import java.io.File;
import org.apache.commons.io.FileUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;
import upload.dao.FileUploadDAO;
import upload.interceptor.FileUploadDAOAware;
import upload.model.UserInfo;
public class FileUploadAction extends ActionSupport implements Preparable, ModelDriven<UserInfo>, FileUploadDAOAware{
private static final long serialVersionUID = 1L;
// 실제 파일이 저장될 디렉토리
private final String UPLOAD_DIR = "c:/oraclejava/upload/";
private Log log = LogFactory.getLog(FileUploadAction.class);
//----------------------- fileUpload 인터셉터가 설정하는 부분
//----------------------- setter 가 만들어져 있어야 한다.
// fileUpload 인터셉터가 임시디렉토리에 저장한 파일 객체
File doc;
// Content Type
String docContentType;
// 원본 파일 이름
String docFileName;
//-----------------------------------------------------------------
//-----------------------------------------------------------------
// 도메인 오브젝트
UserInfo userInfo;
// 실제 UPLOAD 디렉토리에 보관된 파일 객체
File savedFile;
//FileUploadDAO 참조
FileUploadDAO fileUploadDAO;
public String execute() throws Exception {
//fileUploadDAO의 insert 메소드 호출
if (fileUploadDAO.inserUserInfo(userInfo)) {
log.info(">>>>> fileUploadDAO.inserUserInfo 후...");
// fileUpload 인터셉터가 임시디렉토리에 저장한 파일을 실제 UPLOAD 디렉토리로 복사
// 임시 디렉토리의 파일은 Action 종료 후 fileUpload 인터셉터가 삭제한다.
if (doc != null && doc.exists()) {
log.info(">>>>> File Copy 전...");
savedFile = new File(UPLOAD_DIR + docFileName);
FileUtils.copyFile(doc, savedFile);
log.info(">>>>> File Copy 후...");
}
}
return SUCCESS;
}
//-----------------------------------------
//setter
//-----------------------------------------
/**
* 임시디렉토리에 저장한 파일 객체
*/
public void setDoc(File doc) {
this.doc = doc;
}
/**
* ContentType
*/
public void setDocContentType(String docContentType) {
this.docContentType = docContentType;
}
/**
* 원본 파일 이름
*/
public void setDocFileName(String docFileName) {
this.docFileName = docFileName;
}
/**
* FileUploadDAOInterceptor에서 FileUploadDAO 를 주입한다.(DI, Dependency Injection)
*/
public void setFileUploadDAO(FileUploadDAO fileUploadDAO) {
this.fileUploadDAO = fileUploadDAO;
}
//-----------------------------------
//getter
//-----------------------------------
/**
* Model 빈
*/
public UserInfo getUserInfo() {
return userInfo;
}
/**
* 임시파일 객체
*/
public File getDoc() {
return this.doc;
}
/**
* 실제 UPLOAD 디렉토리에 보관된 파일 객체
*/
public File getSavedFile() {
return this.savedFile;
}
/**
* Preparable 인퍼페이스의 prepare 메소드 구현
*/
public void prepare() throws Exception {
userInfo = new UserInfo();
}
/**
* ModelDriven 인퍼페이스의 getModel 메소드 구현
*/
public UserInfo getModel() {
return userInfo;
}
2. DAO 클래스
[FileUploadDAO.java]
package upload.dao;
import upload.model.UserInfo;
public class FileUploadDAO {
public boolean inserUserInfo(UserInfo userInfo) {
//DB연결 후 넘어오는 사용자 정보를 가지고 Insert
return true;
}
}
3. DAO 주입 위한 입터셉터를 위한 인터페이스
[FileUploadDAOAware.java]
package upload.interceptor;
import upload.dao.FileUploadDAO;
//이 인터페이스를 구현한 액션은 FileUploadDAO빈을 주입가능
public interface FileUploadDAOAware {
public void setFileUploadDAO(FileUploadDAO fileUploadDAO);
}
4. DAO 주입 위한 입터셉터
[FileUploadDAOInterceptor.java]
package upload.interceptor;
import upload.dao.FileUploadDAO;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class FileUploadDAOInterceptor implements Interceptor {
private static final long serialVersionUID = 1L;
FileUploadDAO fileUploadDAO;
public void init() {
fileUploadDAO = new FileUploadDAO();
}
public void destroy() {
fileUploadDAO = null;
}
public String intercept(ActionInvocation invocation) throws Exception {
Object action = invocation.getAction();
if (action instanceof FileUploadDAOAware) {
FileUploadDAOAware fileUploadDAOAware = (FileUploadDAOAware)action;
fileUploadDAOAware.setFileUploadDAO(fileUploadDAO);
}
return invocation.invoke();
}
}
5. Model 클래스
아래 UserInfo.java에 form에서 파일 객체를 넘기기 위한 변수 (doc)에 대해 설정되면 안됨. doc는 fileUpload 인터셉터에 의해 사용되어야 함.
[UserInfo.java]
package upload.model;
public class UserInfo {
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
6. struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.multipart.saveDir" value="/tmp"/>
<package name="struts2" extends="struts-default">
<interceptors>
<interceptor name="fileUploadDao" class="upload.interceptor.FileUploadDAOInterceptor"/>
</interceptors>
<action name="fileupload" class="upload.action.FileUploadAction">
<interceptor-ref name="prepare"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="params"/>
<interceptor-ref name="fileUploadDao"/>
<result>/upload/upload_ok.jsp</result>
</action>
</package>
</struts>
7. web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Struts2</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
8. JSP 파일들(interceptor/upload 폴더에 작성)
[upload.jsp]
<%@ page pageEncoding="euc-kr" %>
<html>
<body>
<form action="fileupload.action" method="post" enctype="multipart/form-data">
name : <input type="text" name="name"><br>
age : <input type="text" name="age"><br>
photo : <input type="file" name="doc"><br>
<input type="submit">
</form>
</body>
</html>
[upload_ok.jsp]
<%@ page pageEncoding="euc-kr" %>
파일 업로드 OK!!
9. http://localhost:8080/interceptor/upload/upload.jsp 라고 입력 후 결과 확인하자.
2008. 11. 26 오후 2:25:19 upload.action.FileUploadAction execute
정보: >>>>> fileUploadDAO.inserUserInfo 후...
2008. 11. 26 오후 2:25:19 upload.action.FileUploadAction execute
정보: >>>>> File Copy 전...
2008. 11. 26 오후 2:25:19 upload.action.FileUploadAction execute
정보: >>>>> File Copy 후...
댓글 없음:
댓글 쓰기