- mmons project의 upload API를 사용한다.
(commons-fileupload-1.2.1.jar, commons-io-1.4.jar)
- Struts1의 파일 업로드는 FormFile class를 사용한다.
- File Upload에서 고려해야 할 사항 3가지는
1) 저장할 디렉터리 위치
2) 파일 용량 제한
3) 동일한 파일 이름 해결(Rename Policy)
: 1/1000초 로 계산하여 파일 이름 변경, 파일 명 뒤에 숫자 붙여서 저장
그리고 다 아는 것처럼 DB에는 파일이 저장되는게 아니라 파일 이름과 사이즈가 저장된다. 그걸 통해서 파일을 업로드 다운로드 한다.
1. struts-config.xml 파일 작성 (DispatchAction을 사용하였다.)
<?xml version="1.0" encoding="EUC-KR" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://struts.apache.org/dtds/struts-config_1_3.dtd">
<struts-config>
<!-- ================================================ Form Bean Definitions -->
<!-- form으로 들어오는 데이터를 bean객체에 담는다 -->
<form-beans>
<form-bean name="uploadBean" type="com.myhome.upload.beans.UploadFormBean"/> <!-- name은 아무거나 하고 type는 담을 object 객체를 써준다.(전달된 파라미터 데이터가 설정된 빈 - MyBean - 으로 저장이 된다) -->
</form-beans>
<!-- ========================================= Global Exception Definitions -->
<!-- 어떤 Action에서 Exception이 발생되었는지 모를 때 정의된 곳으로 페이지 이동시킨다. -->
<global-exceptions>
</global-exceptions>
<!-- =========================================== Global Forward Definitions -->
<!-- -->
<global-forwards>
</global-forwards>
<!-- =========================================== Action Mapping Definitions -->
<!-- url패턴으로 맵핑 시킴 -->
<action-mappings>
<action path="/index"
type="org.apache.struts.actions.ForwardAction"
parameter="/upload/register.jsp"/>
<action path="/upload"
name="uploadBean"
scope="request"
parameter="method"
unknown="true"
type="com.myhome.upload.actions.UploadDispatchAction">
<forward name="result" path="/upload/result.jsp"/>
<forward name="fail" path="/upload/fail.jsp"/>
<forward name="list" path="/upload/list.jsp"/>
<forward name="query" path="/upload/modify.jsp"/>
<forward name="update" path="/upload/template.jsp"/>
<forward name="delete" path="/upload/template.jsp"/>
</action>
<action path="/download"
type="com.myhome.upload.actions.FileDownloadAction"/>
</action-mappings>
<!-- controller processor Definition : Action으로 호출하지 전 처리할 부분-->
<controller processorClass="com.myhome.info.processor.InfoRequestProcessor"/>
</struts-config>
2. web.xml 추가
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>Struts1FileUploadDownload</display-name>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>
org.apache.struts.action.ActionServlet
</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>
/WEB-INF/struts-config.xml
</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
- iBatis 설정 제외(파일 참조)
3. Bean 작성
package com.myhome.upload.beans;
import org.apache.struts.action.ActionForm;
import org.apache.struts.upload.FormFile;
@SuppressWarnings("serial")
public class UploadFormBean extends ActionForm implements java.io.Serializable{
/*form property*/
private int num;
private String name;
private String sex;
private String tel;
private String wdate;
/*upload property*/
private FormFile file;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getWdate() {
return wdate;
}
public void setWdate(String wdate) {
this.wdate = wdate;
}
public FormFile getFile() {
return file;
}
public void setFile(FormFile file) {
this.file = file;
}
}
import org.apache.struts.action.ActionForm;
import org.apache.struts.upload.FormFile;
@SuppressWarnings("serial")
public class UploadFormBean extends ActionForm implements java.io.Serializable{
/*form property*/
private int num;
private String name;
private String sex;
private String tel;
private String wdate;
/*upload property*/
private FormFile file;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getWdate() {
return wdate;
}
public void setWdate(String wdate) {
this.wdate = wdate;
}
public FormFile getFile() {
return file;
}
public void setFile(FormFile file) {
this.file = file;
}
}
4. 데이터를 저장할 DTO 작성
package com.myhome.upload.dto;
public class UploadDTO{
/*entity property*/
private int num;
private String name;
private String sex;
private String tel;
private String wdate;
private String fileName;
private long fileSize;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getWdate() {
return wdate;
}
public void setWdate(String wdate) {
this.wdate = wdate;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public long getFileSize() {
return fileSize;
}
public void setFileSize(long fileSize) {
this.fileSize = fileSize;
}
}
public class UploadDTO{
/*entity property*/
private int num;
private String name;
private String sex;
private String tel;
private String wdate;
private String fileName;
private long fileSize;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getWdate() {
return wdate;
}
public void setWdate(String wdate) {
this.wdate = wdate;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public long getFileSize() {
return fileSize;
}
public void setFileSize(long fileSize) {
this.fileSize = fileSize;
}
}
5. 데이타베이스에 데이터를 입력하기 위한 DAO 작성
package com.myhome.upload.dao;
import java.sql.SQLException;
import java.util.List;
import com.myhome.manager.SQLManager;
import com.myhome.upload.dto.UploadDTO;
public class UploadDAO extends SQLManager{
public void insert(UploadDTO dto) throws SQLException{
this.getSqlMap().insert("uploadInsert",dto);
}
@SuppressWarnings("unchecked")
public List<UploadDTO> list() throws SQLException{
return (List<UploadDTO>)this.getSqlMap().queryForList("uploadList");
}
}
import java.sql.SQLException;
import java.util.List;
import com.myhome.manager.SQLManager;
import com.myhome.upload.dto.UploadDTO;
public class UploadDAO extends SQLManager{
public void insert(UploadDTO dto) throws SQLException{
this.getSqlMap().insert("uploadInsert",dto);
}
@SuppressWarnings("unchecked")
public List<UploadDTO> list() throws SQLException{
return (List<UploadDTO>)this.getSqlMap().queryForList("uploadList");
}
}
6. UploadSqlMap.xml
<?xml version="1.0" encoding="euc-kr"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap>
<typeAlias alias="Upload"
type="com.myhome.upload.dto.UploadDTO"/> <!-- alias : 별칭을 잡겠다는 의미 -->
<insert id="uploadInsert" parameterClass="Upload"> <!-- typeAlias한 Info를 넣는다 없으면 com.. 그대로 넣어도 된다. -->
INSERT INTO UPLOAD
(NUM, NAME, SEX, TEL, WDATE, FILENAME, FILESIZE)
VALUES
(NUMSEQ.NEXTVAL, #name#, #sex#, #tel#, #wdate#,#fileName#,#fileSize#) <!-- ## Info 안에 가지는 프로퍼티 대소문자가 정확하게 맞아야 한다. -->
</insert>
<statement id="uploadList" resultClass="Upload">
<![CDATA[
SELECT NUM, NAME, SEX, TEL, WDATE, FILENAME, FILESIZE
FROM UPLOAD
WHERE NUM > 0
]]>
ORDER BY NUM DESC
</statement>
</sqlMap>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap>
<typeAlias alias="Upload"
type="com.myhome.upload.dto.UploadDTO"/> <!-- alias : 별칭을 잡겠다는 의미 -->
<insert id="uploadInsert" parameterClass="Upload"> <!-- typeAlias한 Info를 넣는다 없으면 com.. 그대로 넣어도 된다. -->
INSERT INTO UPLOAD
(NUM, NAME, SEX, TEL, WDATE, FILENAME, FILESIZE)
VALUES
(NUMSEQ.NEXTVAL, #name#, #sex#, #tel#, #wdate#,#fileName#,#fileSize#) <!-- ## Info 안에 가지는 프로퍼티 대소문자가 정확하게 맞아야 한다. -->
</insert>
<statement id="uploadList" resultClass="Upload">
<![CDATA[
SELECT NUM, NAME, SEX, TEL, WDATE, FILENAME, FILESIZE
FROM UPLOAD
WHERE NUM > 0
]]>
ORDER BY NUM DESC
</statement>
</sqlMap>
7. UploadUtil.java를 만들어서 파일 경로와 사이즈를 관리한다.
package com.myhome.upload.util;
public final class UploadUtil {
public static final String SAVE = "D://Java_webprogramming_2/Java_Web2/edu/upload/"; //경로
public static final String SIZE = "1024*1024*20"; //사이즈 20M 지정
}
8. 비즈니스 로직을 수행할 UploadDispatchAction.java
package com.myhome.upload.actions;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import org.apache.struts.upload.FormFile;
import com.myhome.upload.beans.UploadFormBean;
import com.myhome.upload.dao.UploadDAO;
import com.myhome.upload.dto.UploadDTO;
import com.myhome.upload.util.UploadUtil;
public class UploadDispatchAction extends DispatchAction{
public ActionForward register(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception{
UploadFormBean bean = (UploadFormBean)form;
UploadDTO dto = new UploadDTO();
BeanUtils.copyProperties(dto, bean);
if(bean.getFile() != null){
this.upload(bean.getFile());
dto.setFileName(bean.getFile().getFileName());
dto.setFileSize(bean.getFile().getFileSize());
}else{
dto.setFileName("");
dto.setFileSize(0L);
new NullPointerException("파일을 올려주세요!!");
}
dto.setWdate(this.getWdate());
new UploadDAO().insert(dto);
request.setAttribute("dto", dto);
return mapping.findForward("result");
}
public void upload(FormFile ff) throws Exception {
InputStream is = ff.getInputStream();
OutputStream os = new FileOutputStream(UploadUtil.SAVE + ff.getFileName());
byte buffer[] = new byte[8192];
int n = 0;
while((n = is.read(buffer,0,8192)) != -1){
os.write(buffer, 0, n);
}
/*
System.out.println("File Name: "+ff.getFileName());
System.out.println("File Size: "+ff.getFileSize());
System.out.println("[File Info]");
System.out.println(new String(ff.getFileData()));
*/
is.close();
os.close();
}
/*리스트 부분*/
public ActionForward list(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception{
request.setAttribute("list", new UploadDAO().list());
return mapping.findForward("list");
}
protected String getWdate(){
return new java.text.SimpleDateFormat("yyyy-MM-dd").format(new java.util.Date());
}
}
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import org.apache.struts.upload.FormFile;
import com.myhome.upload.beans.UploadFormBean;
import com.myhome.upload.dao.UploadDAO;
import com.myhome.upload.dto.UploadDTO;
import com.myhome.upload.util.UploadUtil;
public class UploadDispatchAction extends DispatchAction{
public ActionForward register(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception{
UploadFormBean bean = (UploadFormBean)form;
UploadDTO dto = new UploadDTO();
BeanUtils.copyProperties(dto, bean);
if(bean.getFile() != null){
this.upload(bean.getFile());
dto.setFileName(bean.getFile().getFileName());
dto.setFileSize(bean.getFile().getFileSize());
}else{
dto.setFileName("");
dto.setFileSize(0L);
new NullPointerException("파일을 올려주세요!!");
}
dto.setWdate(this.getWdate());
new UploadDAO().insert(dto);
request.setAttribute("dto", dto);
return mapping.findForward("result");
}
public void upload(FormFile ff) throws Exception {
InputStream is = ff.getInputStream();
OutputStream os = new FileOutputStream(UploadUtil.SAVE + ff.getFileName());
byte buffer[] = new byte[8192];
int n = 0;
while((n = is.read(buffer,0,8192)) != -1){
os.write(buffer, 0, n);
}
/*
System.out.println("File Name: "+ff.getFileName());
System.out.println("File Size: "+ff.getFileSize());
System.out.println("[File Info]");
System.out.println(new String(ff.getFileData()));
*/
is.close();
os.close();
}
/*리스트 부분*/
public ActionForward list(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception{
request.setAttribute("list", new UploadDAO().list());
return mapping.findForward("list");
}
protected String getWdate(){
return new java.text.SimpleDateFormat("yyyy-MM-dd").format(new java.util.Date());
}
}
'FrameWork > Struts1' 카테고리의 다른 글
struts1 커스터마이징하여 사용하기. (0) | 2009.11.11 |
---|---|
Struts1 FileDownload (0) | 2009.08.18 |
Struts1의 Action 4 (0) | 2009.08.16 |
Struts1의 Action 3 (0) | 2009.08.16 |
Struts1의 Action 2 (0) | 2009.08.12 |
Struts1의 Action 1 (0) | 2009.07.27 |
Struts1에서 ActionForm 사용하기. (0) | 2009.07.25 |
Struts1 에서 iBatis 사용하기 (0) | 2009.07.05 |
Struts 1 을 사용하여 간단한 회원가입, 리스트 불러오기. (0) | 2009.07.05 |
Struts1 개발환경 설정. (0) | 2009.07.05 |