Preloader image
DDD

자바

java jquery file upload ~ !! ( formData 방식 )

작성자 관리자 (admin)
조회수 1,014
입력일 2020-05-30 09:54:44

---- script ----


<script type="text/javascript">

function ajaxFileUpload() 
{
    var form     = $("#ajaxFrom")[0];
    var formData = new FormData(form);

    // ajax + file upload 는 serialize 가 불가합니다!!!
//    formData.append( "file"        , $("#ajaxFile"    )[0].files[0]);
    formData.append( "file"        , $("#ajaxFile"    ).get(0).files[0] ); 2개 모두 가능

    formData.append( "bbs_subject" , $("#bbs_subject ").val() ); // 
    formData.append( "bbs_contents", $("#bbs_contents").val() ); // 
    formData.append( "bbs_id"      , $("#bbs_id      ").val() ); // 
    formData.append( "bbs_code"    , $("#bbs_code    ").val() ); // 
    formData.append( "bbs_name"    , $("#bbs_name    ").val() ); // 
    
    
    alert(formData);
    alert(formData.bbs_name);
    
    jQuery.ajax(
    {
          url         : "/admin/upload_process.do"
        , type        : "POST"
        , processData : false
        , contentType : false
        , data        : formData
        , success     : function(json) {
            var obj = JSON.parse(json);
            alert( obj.bbs_code )
        }
    });
}

</script>

---- html----

<!-- enctype="multipart/form-data" 필요 없음!!! -->
<form id="ajaxFrom" method="post">
    <input type="text" id="mode"     value="insert"/>
    <input type="text" id="bbs_name" value="test good!!!"/>
    <input type="file" id="ajaxFile" multiple/>
    <button class="w2ui-btn" onClick="ajaxFileUpload();"> 업로드 </button>
</form>
 

---- java controller ----

    // Map + File Upload 패턴
    @RequestMapping(value = {"/upload_ajax_process.do", "/admin/upload_process.do"}, method = { RequestMethod.POST, RequestMethod.GET })
    public String upload_process
    (
          ModelMap                             model
        , HttpServletRequest                 request
        , HttpServletResponse               response
        , HttpSession                        session
        , @RequestParam Map  params
        , com_file_array                         cfa
    )
    throws Exception
    {
        logger.debug( "●● upload_process ●●");
        logger.debug( "●● mode     : " + params.get("mode") );
        logger.debug( "●● bbs_name : " + params.get("bbs_name") );

        // common control
        String URI  = request.getRequestURI();
        boardService.bbs_board_list_ajax(params); // CRUD process 작성

        /*
         *  @ File Upload
         *  @ Param : file
         */
        List<MultipartFile> files     = cfa.getFile();
        List<String>        fileNames = new ArrayList<String>();

        logger.debug("●●-> 오브젝트           : " + files       ); // 파일 오브젝트
        logger.debug("●●-> 업로드 파일 개수 : " + files.size()); // 업로드 파일 개수

        int    pos            =    0; // index of
        String ext            = null; // 업로드 된 파일의 혹장자
        String real_filename  = null; // DB에 실제 들어가는 파일명
        String fileName       = null; // 업로드 된 파일명
        long r_time           =    0; // 
        int  r_count          =    0; // 
        String file_rand_name = null;
        
        // 파일이 존재하는 경우만 적용
        if ( files.size() > 0 )
        {
            String path1 = "C:/upload_real/"; // 메인 업로드 디렉토리
            String path2 = "C:/upload_db/";  // 백업 업로드 디렉토리
            
            // multiple upload - loop
            for (MultipartFile multipartFile : files)
            {
                fileName = multipartFile.getOriginalFilename();
                fileNames.add(fileName);

                pos            = fileName.lastIndexOf( "." )      ; // 순서
                ext            = fileName.substring( pos + 1 )    ; // 확장자
                r_time         = System.currentTimeMillis()       ; // 난수용 날짜
                r_count        = (int)(Math.random()*1000000)     ; // 난수용 번호
                file_rand_name = (String) (r_time + "_" + r_count); // 난수 파일명 생성
                real_filename  = file_rand_name + "." + ext       ; // 사업자번호로 변경된 파일명 생성

                // 파일 공통 테이블 입력 (변동)
                logger.debug("●●-> fileName : " + fileName);
                File uFile = new File( path1 + fileName      ); // 실제 파일 위치

                try
                {
                    logger.debug("●●-> 원래파일 : " + path1 + fileName);
                    multipartFile.transferTo(uFile); // 파일 저장

                    logger.debug("●●-> 복사파일 : " + path2 + real_filename );
                    File tFile = new File( path2 + real_filename );
                    CommonUtil.FileCopy( uFile, tFile ); // source file , target file
                }
                catch (IOException e)
                {
                    logger.debug( "●●-> IOException : " + e );
                }
            }
        }

        logger.debug( "●●-> 원래 파일명 : " + "R" + fileName + "_000001" );

        return "redirect:" + "/admin/upload.do?URI=" + URI;
    }

 

 

^