jongviet

May 26, 2021 - JSP 웹 file 삽입/수정/삭제(개인 필기) 본문

Spring legacy

May 26, 2021 - JSP 웹 file 삽입/수정/삭제(개인 필기)

jongviet 2021. 5. 26. 23:27

*5월26일

-JSP 웹 file 삽입/수정/삭제 코드 및 주석 (+@ thumbnail!)

 

 

 

*파일 삽입

     <form action="./insert.em" method="post"  enctype="multipart/form-data"> //jsp내 인코딩 타입 추가; method="post"를 type="post"로 적어서 고생좀함..

 

                <tr>

                      <th>file</th>

                      <td><input type="file" name="empfile"></td>  // 파일 추가

                </tr>

 

     public void execute(HttpServletRequest req,  HttpServletResponse res) {

           

           String realPath = ""; //실제 파일이 저장될 위치

           String virtualPath = "/upload"; //이클립스 폴더 경로,  프로그램 인식용 매핑

           String encType = "UTF-8";

           int limitSize = 1024*1024*5; // Byte 단위, 총 5mb

           

           //톰캣에서 구동되는 서블릿이 프로젝트(app)을 인지하는 실제 위치 값

           realPath =  req.getServletContext().getRealPath(virtualPath);

           EmpDAO edao = new EmpDAO();

           int result = 0;

           int result2 = 0;

           

           try {

                MultipartRequest multi = new  MultipartRequest(req, realPath, limitSize, encType, new DefaultFileRenamePolicy()); //여기서 파일 객체가 생성됨

                

                int empno =  Integer.parseInt(multi.getParameter("empno"));

                

                result = edao.insert(new EmpVO(

                           empno,

                           multi.getParameter("ename"),

                           multi.getParameter("job"),

                           Integer.parseInt(multi.getParameter("sal")),

                           Integer.parseInt(multi.getParameter("deptno"))));

                logger.info(result > 0 ? "emp 데이터 입력 성공" :  "emp 데이터 입력 실패");

 

                //입력 성공 시 파일 담으면 됨!

                if(result > 0) {

                      Enumeration files = multi.getFileNames();  //실려있는 파일의 이름을 순서화 시켜서 저장

                      if(files.hasMoreElements()) { //여러개는  while로하면됨,

                           String paramName = (String)  files.nextElement();

                           String fileName =  multi.getFilesystemName(paramName);

//                         logger.info(">>> fileName > " +  fileName);

 

                           //empno, fileName, fileType

                           String fileType =  fileName.substring(fileName.lastIndexOf(".")+1); // '.' 자리 기준  +1

                           logger.info(">>> fileType > " +  fileType);

                           result2 = edao.fileUpload(empno,  fileName, fileType);

                           logger.info(result2 > 0 ? "파일 업로드  성공" : "파일업로드 실패");

 

            *substring + lastindexOf 참조용!

           String a = "gold.png";

           String b = a.substring(a.lastIndexOf(".")+1);

           

           System.out.println(b);

 

                            //이미지 처리

                           if(fileType.equalsIgnoreCase("JPG") ||  fileType.equalsIgnoreCase("JPEG")  //equalsIgnoreCase는 대소문자  구분 안하고 점검하는 것

                                      ||  fileType.equalsIgnoreCase("PNG")) {

                                 String thumb_image_name =  realPath + "\\th_" + fileName;

                                 int thumbWidth = 100;

                                 int thumbHeight = 100;                     

                                 Image thumbNail =  JimiUtils.getThumbnail(realPath + "/" + fileName,

                                            thumbWidth,  thumbHeight, Jimi.IN_MEMORY); //실제경로, 이미지너비, 이미지높이,  사용할 방식 순서로 인자 던짐;

                                 

                                 try {

                                      Jimi.putImage(thumbNail,  thumb_image_name);  //썸네일 파일과 이름던져서 최종 생성;

                                      logger.info("썸네일 파일  생성 성공");

                                 } catch (JimiException e) {

                                      logger.error("썸네일 파일  생성 오류");

                                      e.printStackTrace();

                                 }

                           }

                      }

                }

           } catch (IOException e) {

                e.printStackTrace();

           }    

           logger.info(result > 0 && result2 > 0 ? "입력 성공" :  "입력 실패");

     }

}

 

*thumb nail 처리! 라이브러리 존재(http://www.docjar.com/jar_detail/JimiProClasses.jar.html)

-쇼핑몰 작은 이미지 압축 -> thumbnail, 1.5mb -> 4kb. 무조건 알아야하는 기술중 하나임!! 라이브러리 존재함.

-파일첨부가 안될 수도 있으니, inner join 보다는 left join으로 모두 다 나오게 해야함!(null은 null로 표시됨);

-파일삽입,수정,삭제

 

SQL = "SELECT empno, ename, job, sal, deptno, filename,  fileType FROM emp e left join tbl_files f  on e.empno = f.empno";

 

<img src="res/DD.jfif" alt="">

 

*파일삭제

-RemoveFileAction

 

           //tbl_files DB 및 실제 파일 삭제

           EmpDAO edao = new EmpDAO();

           int empno =  Integer.parseInt(req.getParameter("empno"));

           String curfile = req.getParameter("curfile");

           

           boolean isDel = false;

           int result = 0;

 

           //파일 먼저 삭제

           if(curfile != null) {

                String uploadedFileName =  req.getServletContext().getRealPath("/upload/") + curfile;

                File realFile = new File(uploadedFileName);  //파일객체 생성

                isDel = realFile.delete(); //boolean type 리턴

                logger.info(isDel == true ? "파일 삭제 성공" :  "파일 삭제 실패");

 

                //tbl_files DB삭제

                if(isDel) {

                      result = edao.deleteFile(empno);

                      logger.info(result > 0 ? "tbl_files 삭제  성공" : "tbl_files 삭제 실패");

                }

                String fileType =  curfile.substring(curfile.lastIndexOf(".") + 1);

                if(fileType.equalsIgnoreCase("JPG") ||  fileType.equalsIgnoreCase("JPEG") ||  fileType.equalsIgnoreCase("PNG")) {

                      String uploadedThumbFileName =  req.getServletContext().getRealPath("/upload/th_") + curfile;

                      File realThumbFile = new  File(uploadedThumbFileName); //썸네일객체 생성

                      isDel = realThumbFile.delete();

                      logger.info(isDel == true ? "썸네일 삭제  성공" : "썸네일 삭제 실패");

                }

           }    

           req.setAttribute("empno", Integer.valueOf(empno));  //디테일 페이지 상 해당되는 empno 띄우기 위해서 객체형으로 보냄, java에서는 get, post 방식으로 보낼 수 없음(form이나 가능).... -> attribute 형태로 객체를 보냄

 

->Integer empno = (Integer) req.getAttribute("empno");  //파일만 삭제한 이후 상황,,

        

*int / integer의 차이

-Integer.parseInt()는 primitive type 즉, int를 반환! 

-Integer.valueOf(empno)는 숫자는 숫자이나, 객체 형태의 숫자임! 따라서 setAttribute 객체형으로 넘길 수 있음. 숫자끼리 연산도 가능; reference type

-Primitive -> wrapper calss(reference 참조형)를 boxing / wrapper class -> primitive를 unboxing..

 

*int

-Primitive 자료형

-null 로 초기화 불가능합니다.

*Integer

-Wrapper 클래스 / 객체 / reference

-매개변수가 객체로 요구될 때, 기본형값이 아닌 객체로 저장해야 할 때, 객체간의 비교가 필요할 때 사용!!

 

*삭제의 종류

-DB접속하지 않고 바로 지울 수 있는 경우가 있고, DB접속해서 추가적인 정보(삭제할 권한이 있는지, 유효한 요청인지?)를 가져와야지만 지울 수 있는 경우가 있음. 그게 DeleteAction과 Delete2Action임!

-> 또한 URL에 쉽게 던지면 안되는 보안정보는 식별자만 get으로 던지고, DB에서 정보를 꺼내와서 처리해야 함.

-> 일반적으로는 수정과 삭제는 post방식으로만 해야함! 

 

 

*파일수정

-파일존재 -> 파일삭제 or 파일변경 // 파일미존재 -> 파일추가 or 데이터만 변경

-기본적으로 insert와 비슷함. 파일을 지우고 넣는 경우이기 때문!!

 

           EmpDAO edao = new EmpDAO();

           String realPath = ""; // 실제 파일이 저장될 위치

           String virtualPath = "/upload"; // 이클립스 폴더 경로,  프로그램 인식용 매핑

           String encType = "UTF-8";

           int limitSize = 1024 * 1024 * 5; // Byte 단위, 총 5mb

 

           // 톰캣에서 구동되는 서블릿이 프로젝트(app)을 인지하는  실제 위치 값

           realPath =  req.getServletContext().getRealPath(virtualPath);

           try {

                MultipartRequest multi =

                           new MultipartRequest(req, realPath,  limitSize, encType,

                           new DefaultFileRenamePolicy()); //  여기서 파일 객체가 생성됨

                

                // emp 테이블 변경

                int empno =  Integer.parseInt(multi.getParameter("empno"));

                int mgr =  Integer.parseInt(multi.getParameter("mgr"));

                int sal =  Integer.parseInt(multi.getParameter("sal"));

                int comm =  Integer.parseInt(multi.getParameter("comm"));

                int deptno =  Integer.parseInt(multi.getParameter("deptno"));

                String ename = multi.getParameter("ename");

                String job = multi.getParameter("job");

                String hiredate =  (multi.getParameter("hiredate"));

                String curfileName =  multi.getParameter("curfile");

 

                Enumeration files = multi.getFileNames(); //  실려있는 파일의 이름을 순서화 시켜서 저장

                if (files.hasMoreElements()) { // 여러개는  while로하면됨,

                      String paramName = (String)  files.nextElement();

                      String fileName =  multi.getFilesystemName(paramName);  //뉴파일 케이스!

                      logger.info(">>> fileName > " + fileName);

                      

 

                    // 파일 변경 케이스

                      if (fileName != null) {

 

                           // 기존 curfile 먼저 삭제 필요!!!!, 기존파일이 없고 뉴파일만 있다면 본 if문 건너뛰고 추가만 진행

                           if (curfileName != null) {

                                 String uploadedFileName =  req.getServletContext().getRealPath("/upload/") + curfileName;

                                 File realFile = new  File(uploadedFileName); // 파일객체 생성

                                 boolean isDel =  realFile.delete();

                                 logger.info(isDel == true ? "파일  삭제 성공" : "파일 삭제 실패");

                                 // tbl_files DB삭제

                                 if (isDel)  edao.deleteFile(empno);

                                 String curfileType =  curfileName.substring(curfileName.lastIndexOf(".") + 1);

                                 if  (curfileType.equalsIgnoreCase("JPG") ||  curfileType.equalsIgnoreCase("JPEG")

                                            ||  curfileType.equalsIgnoreCase("PNG")) {

                                      String  uploadedThumbFileName =  req.getServletContext().getRealPath("/upload/th_")

                                                 + curfileName;

                                      File realThumbFile = new  File(uploadedThumbFileName); // 썸네일객체 생성

                                      isDel =  realThumbFile.delete();

                                      logger.info(isDel == true ?  "썸네일 삭제 성공" : "썸네일 삭제 실패");

                                 }

                           }

                           // 새로 업데이트된 파일의 empno,  fileName, fileType 업데이트

                           String fileType =  fileName.substring(fileName.lastIndexOf(".") + 1); // '.' 자리  기준 +1

                           logger.info(">>> fileType > " +  fileType);

                           edao.fileUpload(empno, fileName,  fileType);

                           // logger.info(result2 > 0 ? "파일  업로드 성공" : "파일업로드 실패");

                           // 이미지 처리

                           if (fileType.equalsIgnoreCase("JPG")  || fileType.equalsIgnoreCase("JPEG") // equalsIgnoreCase는  대소문자 구분x

                                 ||  fileType.equalsIgnoreCase("PNG")) {

                                 String thumb_image_name =  realPath + "\\th_" + fileName;

                                 int thumbWidth = 100;

                                 int thumbHeight = 100;

                                 Image thumbNail =  JimiUtils.getThumbnail(realPath + "/" + fileName, thumbWidth,  thumbHeight,

                                            Jimi.IN_MEMORY); //  실제경로, 이미지너비, 이미지높이, 사용할 방식 순서로 인자 던짐;

                                 try {

                                      Jimi.putImage(thumbNail,  thumb_image_name); // 썸네일 파일과 이름던져서 최종 생성;

                                      logger.info("썸네일 파일  생성 성공");

                                 } catch (JimiException e) {

                                      logger.error("썸네일 파일  생성 오류");

                                      e.printStackTrace();

                                 }

                           }

                      } //파일 변경 없이 emp 정보만 변경, 파일 처리에 관계 없이 별도로 if문 밖에서 처리;

                      int result = edao.modify(new EmpVO(empno,  ename, job, mgr, sal, comm, hiredate, deptno));

                      logger.info(result > 0 ? "수정성공" :  "수정실패");

                }

           } catch (IOException e) {

                e.printStackTrace();

           }

     }

 

Comments