-
스프링 게시판 - ckeditor4 (ck에디터)연동 - 가비지이미지 삭제 (3)Spring 2023. 4. 2. 15:00반응형
2023.03.25 - [Spring] - 스프링 게시판 - ckeditor4 (ck에디터)연동 - 이미지업로드 (2)
ckeditor로 올리는 사진 첨부는 파일 업로드를 하고 나서 이미지 src를 본문에 넣어 보여주는 형태이다.
문제는 글을 최종 저장할 때 본문에 사진을 삭제하면 기존에 업로드했던 이미지 파일에 대해 삭제할 수 있는 기능이 없다.
실제 저장하는 이미지와 본문에서 삭제한 이미지를 처리하는 방법을 포스팅하겠다.1. 사진을 업로드할때 마다 변수에 파일정보를 담기 (파일업로드 후 실행하는 콜백함수 이용)
//이미지 첨부파일 정보 let originImgFileList = []; //이미지 업로드가 끝나고 실행하는 함수 CKEDITOR.on( 'dialogDefinition', function( ev ) { let dialogName = ev.data.name; let dialogDefinition = ev.data.definition; let uploadTab = dialogDefinition.getContents( 'Upload' ); let uploadButton = uploadTab.get('uploadButton'); uploadButton['filebrowser']['onSelect'] = function( fileUrl, errorMessage ) { //글 작성후 업로드한 이미지정보를 를 담는다. if(fileUrl){ originImgFileList.push(fileUrl); } } });
uploadButton 함수는 이미지 파일업로드 성공 콜백 함수다.
콜백 파라미터 fileUlr에는 이미지 업로드 정보가(경로+파일명) 담겨있다.
이미지를 업로드할때 마다 fileUlr 값을 originImgFileList 배열에 넣는다.
2. 최종 본문글 저장시 삭제 이미지정보 체크(front - javascript 로 처리)
아래의 변수를 출력하면 현시점의 에디터 본문 내용이 담겨 있다.
CKEDITOR.instances.ckeditor.getData());
저장버튼 누를때 이 본문내용에서 src주소를 추출하여 업로드할때 이미지 주소를 비교하여 삭제대상 이미지정보를 추출한다.
3. 본문에서 src 정보를 추출하는 함수 작성
let realImgFileList = []; //본문내용에서 추출한 이미지 정보 (다수가 존재할 수 있기 때문에 배열) /* * 에디트내용에서 이미지 주소만 추출하기 */ function extractImageTags(editorContent) { const container = document.createElement("div"); container.innerHTML = editorContent; const images = container.getElementsByTagName("img"); for (let i = 0; i < images.length; i++) { realImgFileList.push(images[i].src.replace(/http:\/\/localhost:8080/g, "")); } }
위의 함수는 본문내용 중 src 태그 엘리먼트를 찾아 src값을 찾는 방법이다.
replace를 하는이유는 실제 이미지 경로는 도메인 이후부터 이기때문에 도메인 부분은 공백처리한다.
ex) http://localhost:8080/image/upload/file.jpg ➞ /image/upload/file.jpg
4. A, B배열 비교 후 중복 없는 것 추출하기
//한쪽에만 있는 배열의 값을 추출한다. function getDifference(array1, array2) { return array1.filter(element => !array2.includes(element)) .concat(array2.filter(element => !array1.includes(element))); }
originImgFileList 배열 > 이미지를 업로드할 때 마다 정보를 쌓은 배열
realImgFileList 배열 > 실제 본문에 있는 이미지 정보 배열
위의 배열 2개를 비교하여 얻은 결과값이 최종 삭제대상 이미지 정보이다.
5. 최종삭제대상 배열 서버로 전송
let deleteImgFileList = getDifference(originImgFileList, realImgFileList);
deleteImgFileList 변수에 담은 삭제파일 정보를 본문글 저장할 때 vo에 넣어 서버로 전송하여 파일 삭제처리를 한다.
6. 서버에서의 처리
게시판 bbsVo.java @Data public class BbsDto { ..... ..... /*게시판 제목*/ private String title; /*게시판 내용*/ private String content; /*이미지 삭제 목록*/ private List<String> deleteImageList; } ======================================================================== 게시판 bbsService.java if(bbsVo.getDeleteImageList() != null) { System.out.println("저장-삭제대상 이미지 수 : "+bbsVo.getDeleteImageList().size()); bbsService.deleteImageList(bbsVo); //물리적파일을 지우는 로직, java.io.File의 delete 메서드이용 }
vo에 이미지삭제정보를 담아 서버에서 이미지 삭제정보가 있을 시 삭제 로직을 수행하면된다.
이런식으로 처리하면 가비지 이미지파일을 처리할 수 있다.
반응형'Spring' 카테고리의 다른 글
스프링 게시판 - ckeditor4 (ck에디터)연동 - 이미지업로드 (2) (0) 2023.03.25 스프링 게시판 - ckeditor4 (ck에디터)연동 - 기본적용 (1) (0) 2023.03.18 [파일업로드] 이미지 업로드시 엑박오류, 이상한 경로에 C:\...(생략)\.metadata\.plugins\ 저장된다면? (0) 2023.03.05 [Spring] 스프링 AOP를 이용해 트랜잭션(transaction) 처리하기 (0) 2022.06.27 [스프링] Spring Controller 컨트롤러 Ajax 데이터통신 유형 정리 (2) 2022.02.28