본문 바로가기
프로그래밍/struts

struts에서 공통 폼빈(formbean) 및 파일업로드 쓰기

by Super User 2009. 6. 10.

아래의 내용은 여기에 올라와 있는 것과 유사한것입니다.

 

그런데. 이번에는 파일 업로드 부분이 추가 되었습니다.

 

form type이 mutilpart 일경우에. request에서 getParameter로

 

파라메터를 못 가져오더군요.

 

그래서 한참을 찾은 것이. CommonsMultipartRequestHandler 클래스를 이용해서

 

해결했습니다.

 

또한 파일을 여기 Action에서 가져가서 따른 Action으로 넘길때. 메모리의 공간을 찾이 할꺼

 

같아서. 여기서 바로 템프 디렉토리에 저장을 한 다음 파일 명과, 파일의 크기를 넘겨 주는

 

방식을 취했습니다.

 

참고 하실 것이 있으면 참고 하세요.

 

 

 

/*
 * 파일명 : BaseAction.java
 * 버  젼 : 1.0
 * 저작권 :

 * 설  명 : 공통 Action 처리
 */
package ad.com.action;

import java.util.Enumeration;
import java.util.Vector;
import java.util.Hashtable;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.Cookie;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.RequestProcessor;
import org.apache.struts.upload.FormFile;

import org.apache.struts.upload.CommonsMultipartRequestHandler;
import java.io.FileOutputStream;
import java.io.File;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.BufferedOutputStream;

import org.apache.commons.fileupload.FileItem;

import ad.com.form.BaseForm;
import ad.util.common.ReturnResult;
import ad.util.common.Constant;

/**
 * <pre>
 *  공통 Action 처리
 *  세션처리
 *  폼빈처리
 * [관련항목]
 *
 * [사용법]
 *
 * [변경기록]
 *  

 * </pre>
 * @author Copyright(c) 2004-05 by KSC. All right reserved.
 * @version 1.0
 * @see ad.util.common.ReturnResult
 * @see ad.com.form.BaseForm
 * @since 1.1
 */

public abstract class BaseAction extends Action
{

    /**
    * Description  : Action Servlet 에서 호출
    * @param   ActionMapping mapping
    * @param   ActionForm form
    * @param   HttpServletRequest request
    * @param   HttpServletResponse response
    * @return  ActionForward
    * @exception Exception - doExecute 수행
    */
    public ActionForward execute (
                                    ActionMapping mapping,
                                    ActionForm form,
                                    HttpServletRequest request,
                                    HttpServletResponse response
                                 ) throws Exception
    {
        /**
         * 공통 Form Bean
         */
        BaseForm           lo_BaseForm  = null;
        /**
         * content Type
         */
        String             contentType  = null;
        /**
         * HttpServletRequest
         */
        HttpServletRequest req          = null;

        CommonsMultipartRequestHandler mRhdl = null;

        try
        {
            contentType    = request.getContentType();
            /**
             * 사용자 로그인 여부 체크
             */
            if (!CookieCheck(request) )
            {
                return mapping.findForward("login");
            }


            /**
             * contentType 이 multipart/form-data 인지 구분
             */
            if ( (contentType != null) && contentType.startsWith("multipart/"))
            {
                /**
                 * Request parser
                 */
                req   = request;
                mRhdl = new  CommonsMultipartRequestHandler();
                mRhdl.handleRequest(req);
                lo_BaseForm =  getFileitems( mRhdl, getCookieValue(req, getEdtValue ( getFormValue(req) ))) ;

                /**
                 * 업로드 파일 삭제처리(임시 데이터)
                 */
                mRhdl.rollback();
            }
            else
            {
                req = request;
                lo_BaseForm =  getCookieValue(req, getEdtValue ( getFormValue(req) )) ;
            }

            return doExecute(mapping, form, req, response, lo_BaseForm);
        }
        catch (Exception e)
        {
            System.out.println("Exception :: Base Action ["+e.getMessage()+"]");
            return doExecute(mapping, form, request, response, null);
        }
    }

    /**
    * Description  : request에서 폼의 이름과 값을 가져온다.
    * @param   HttpServletRequest req
    * @return  BaseForm
    * @exception Exception return null
    */
    private BaseForm getFormValue(HttpServletRequest req )
    {
        Enumeration  lo_getParam = null;
        String       ls_Param    = "";
        String       ls_Value    = "";
        BaseForm     lo_BForm    = null;

        try
        {
            lo_BForm    = new BaseForm();

            lo_getParam = req.getParameterNames();

            if (lo_getParam != null )
            {
                for ( ; lo_getParam.hasMoreElements() ;)
                {
                    ls_Param = (String)lo_getParam.nextElement() ;
                    ls_Value = req.getParameter(ls_Param);
                    lo_BForm.setParam(ls_Param, ls_Value);
                }
                return lo_BForm;
            }
            else
            {
                return null;
            }
        }
        catch (Exception e)
        {
            System.out.println("Exception :: BaseAction :: getFormValue ["+e.getMessage()+"]");
            return null;
        }
    }

    /**
    * Description  : 에디터 테이블의 데이터를 ReturnResult 형태로 변환 하여
    *                edtList 의 키 값으로 넣는다.
    * @param   BaseForm lo_BaseForm
    * @return  BaseForm
    * @exception Exception return BaseForm
    */
    private BaseForm getEdtValue ( BaseForm lo_BaseForm ){
        ReturnResult  lo_retRst   = null;
        BaseForm      lo_BF       = null;
        String        ls_edtList  = "";
        String        ls_edtValue = "";

        String []     la_edtRowval = null;
        String []     la_edtColval = null;
        String []     la_edtList   = null;

        int           li_idx       = 0;
        Vector        lo_lstVt   = new Vector();

        try
        {
            ls_edtList  = lo_BaseForm.getParam("edtlist" ) != null ? lo_BaseForm.getParam("edtlist" ) : "";
            ls_edtValue = lo_BaseForm.getParam("edtvalue") != null ? lo_BaseForm.getParam("edtvalue") : "";

            if (    (!ls_edtList.trim().equals(""))
                 && (!ls_edtValue.trim().equals(""))
               )
            {
                la_edtList   = ls_edtList.trim().toUpperCase().split(";");
                la_edtRowval = ls_edtValue.split("@");
                for ( li_idx = 0 ; li_idx < la_edtRowval.length ; li_idx ++)
                {
                    la_edtColval = la_edtRowval[li_idx].split(";");
                    lo_lstVt.addElement(la_edtColval);
                }
                lo_retRst = new ReturnResult (lo_lstVt, la_edtList) ;
                lo_BaseForm.setParam ( "edtList" , lo_retRst);
                lo_BF  = lo_BaseForm;
            }
            else
            {
                lo_BF  = lo_BaseForm;
            }

        }
        catch ( Exception  e )
        {
            System.out.println(" Exception :: BaseAction :: getEdtValue ["+e.getMessage()+"]");
        }
        return lo_BF;
    }

    /**
    * Description  : 로그인 여부 체크
    * @param   HttpServletRequest request
    * @return  boolean
    * @exception Exception return false
    */
    private boolean CookieCheck ( HttpServletRequest request ){
        int      li_Loop      = 0;
        String   ls_userid    = "";
        Cookie[] lo_Cookie    = request.getCookies();
        boolean  lb_chk       = false;
        try
        {
            for(li_Loop = 0 ; li_Loop < lo_Cookie.length ; li_Loop ++)
            {
                if (lo_Cookie[li_Loop].getName().equals("PK_USERID"))
                {   // 시스템 계정
                    ls_userid     = lo_Cookie[li_Loop].getValue();
                    break;
                }
            }

            if (ls_userid.trim().equals("") )
            {
                lb_chk  =  false;
            }
            else
            {
                lb_chk  =  true;
            }
            return lb_chk;
        }
        catch ( Exception  e )
        {
            System.out.println(" Exception :: BaseAction :: CookieCheck ["+e.getMessage()+"]");
        }
        return lb_chk;
    }

    /**
    * Description  : 쿠키 값을 Form Bean 에 저장
    * @param   HttpServletRequest request
    * @param   BaseForm lo_BaseForm
    * @return  BaseForm lo_BaseForm
    * @exception none
    */
    private BaseForm getCookieValue ( HttpServletRequest request, BaseForm lo_BaseForm )
    {
        int      li_Loop      = 0;
        Cookie[] lo_Cookie    = request.getCookies();
        try
        {
            for(li_Loop = 0 ; li_Loop < lo_Cookie.length ; li_Loop ++)
            {
                if (lo_Cookie[li_Loop].getName().equals("PK_USERID"))
                {
                    lo_BaseForm.setParam ( "gs_userid" , lo_Cookie[li_Loop].getValue());
                    continue;
                }
                else if (lo_Cookie[li_Loop].getName().equals("PK_USERNM"))
                {
                    lo_BaseForm.setParam ( "gs_usernm" , lo_Cookie[li_Loop].getValue());
                    continue;
                }
                else if (lo_Cookie[li_Loop].getName().equals("PK_DEPTCD"))
                {
                    lo_BaseForm.setParam ( "gs_deptcd" , lo_Cookie[li_Loop].getValue());
                    continue;
                }
                else if (lo_Cookie[li_Loop].getName().equals("PK_DEPTNM"))
                {
                    lo_BaseForm.setParam ( "gs_deptnm" , lo_Cookie[li_Loop].getValue());
                    continue;
                }
                else if (lo_Cookie[li_Loop].getName().equals("PK_WORKDT"))
                {
                    lo_BaseForm.setParam ( "gs_workdt" , lo_Cookie[li_Loop].getValue());
                    continue;
                }
                else if (lo_Cookie[li_Loop].getName().equals("PK_WORKS"))
                {
                    lo_BaseForm.setParam ( "gs_works" , lo_Cookie[li_Loop].getValue());
                    continue;
                }
                else if (lo_Cookie[li_Loop].getName().equals("PK_WORKSNM"))
                {
                    lo_BaseForm.setParam ( "gs_worksnm" , lo_Cookie[li_Loop].getValue());
                    continue;
                }
                else if (lo_Cookie[li_Loop].getName().equals("PK_CLIENTIP"))
                {
                    lo_BaseForm.setParam ( "gs_clientip" , lo_Cookie[li_Loop].getValue());
                    continue;
                }
            }
        } catch ( Exception  e ){
            System.out.println(" Exception :: BaseAction :: getCookieValue ["+e.getMessage()+"]");
        }
        return lo_BaseForm;
    }

    /**
    * Description  : 파일 명과 파일 크기를 Form Bean 에 저장
    * @param   HttpServletRequest request
    * @param   BaseForm lo_BaseForm
    * @return  BaseForm lo_BaseForm
    * @exception Exception return BaseForm
    */
    private BaseForm getFileitems ( CommonsMultipartRequestHandler cMRH, BaseForm lo_BaseForm )
    {
        Enumeration  oFileNames    = null;
        Hashtable    oFileItems    = null;
        String       sFileObjName  = null;
        String       sFileName     = null;
        FormFile     oFileItem     = null;
        File         oCFile        = null;
        int          nFileSize     = -1;
        try
        {
            /**
             * 파일 Object HashTable
             */
            oFileItems  = cMRH.getFileElements();
            if ( oFileItems != null)
            {
                /**
                 * 파일 Object Form Name
                 */
                oFileNames  = oFileItems.keys();
                if (oFileNames != null)
                {
                    for ( ; oFileNames.hasMoreElements() ; )
                    {

                        sFileObjName  = (String) oFileNames.nextElement();

                        /**
                         * 파일
                         */
                        oFileItem  = (FormFile) oFileItems.get(sFileObjName) ;

                        if ( oFileItem == null) continue;

                        sFileName = oFileItem.getFileName();
                        nFileSize = oFileItem.getFileSize() ;

System.out.println("BaseAction :: getFileName ::sFileName ["+ sFileName+"]");
System.out.println("BaseAction :: getFileName ::nFileSize ["+ nFileSize+"]");

                        lo_BaseForm.setParam(sFileObjName ,  sFileName );
                        /**
                         * 파일 크기 10 M
                         */
                        if ( (nFileSize > (10 * 1024000))  )
                        {
                            /**
                             * 파일 용량 초과 및 파일이 존재하지 않을 경우
                             */
                            lo_BaseForm.setParam(sFileObjName+"_size" , "-1" );
                            continue;
                        }

                        /**
                         * 파일 크기 0M 제외
                         */
                        if ( (nFileSize <= 0 ) )
                        {
                            /**
                             * 파일 용량 초과 및 파일이 존재하지 않을 경우
                             */
                            lo_BaseForm.setParam(sFileObjName+"_size" , "0" );
                            continue;
                        }

                        InputStream stream = oFileItem.getInputStream();
                        oCFile             = new File (Constant.TEMP_DIR + sFileName.trim());
                        OutputStream bos   = new BufferedOutputStream(new FileOutputStream(oCFile));
                        int bytesRead      = 0;
                        byte[] buffer      = new byte[8192];
                        while ((bytesRead = stream.read(buffer, 0, 8192)) != -1) {
                            bos.write(buffer, 0, bytesRead);
                        }
                        bos.close();
                        lo_BaseForm.setParam(sFileObjName+"_size" , new Integer(nFileSize).toString() );
                        stream.close();

                    }
                }
            }
        }
        catch (Exception e)
        {
            System.out.println(" Exception :: BaseAction :: getFileitems ["+e.getMessage()+"]");
        }
        return lo_BaseForm;
    }


    /**
    * Description  : BaseAction클래스를 상속하는 클래스들이 구현해야할 메써드.
    * @param ActionMapping mapping,
    * @param ActionForm form,
    * @param HttpServletRequest request,
    * @param HttpServletResponse response,
    * @param BaseForm oTmpMap
    * @return  ActionForward
    * @exception none
    */
 protected abstract ActionForward doExecute(
                                          ActionMapping mapping,
                                          ActionForm form,
                                          HttpServletRequest request,
                                          HttpServletResponse response,
                                          BaseForm oTmpMap
                                           ) throws Exception;
}

'프로그래밍 > struts' 카테고리의 다른 글

스트럿츠 파일 업로드  (0) 2011.02.11
스트럿츠 validate 사용시 CheckBox 폼 받기  (0) 2009.06.10
struts 커스텀 태그  (0) 2009.06.10
struts-config.xml 설명  (1) 2009.06.10
배열 받아오기 및 저장 (iterator)  (0) 2009.06.10