| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- Java
- json
- 예매로직
- spread operator
- jsp
- post
- mongodb
- spring
- html
- Kubernetes
- AWS Route53
- node.js
- AWS
- sessionStorage
- ajax
- zombie-hit apartment
- javascript
- terminationGracePeriodSeconds
- MySQL Error
- Get
- ES6
- git
- Bootstrap
- 인생이재밌다
- AWS RDS
- ssh
- topologySpreadConstraints
- chartjs
- 영화예매
- mysql
- Today
- Total
jongviet
May 26, 2021 - JSP 웹 file 삽입/수정/삭제(개인 필기) 본문
*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();
}
}
'Spring legacy' 카테고리의 다른 글
| June 1, 2021 - 웹 보안 관련 기본(get&post 분기처리, session, admin account) (0) | 2021.06.01 |
|---|---|
| May 28, 2021 - Spring, JSP 각종 용어 개념(학습내용 + 찾은 내용 필기 (1) | 2021.05.28 |
| May 24, 2021 - JSP 3일차(DBCP, JSP encoding) (1) | 2021.05.24 |
| May 23, 2021 - JSP 2일차 (0) | 2021.05.23 |
| May 21, 2021 - JSP 1일차 (0) | 2021.05.21 |