ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 게시판 - 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에 이미지삭제정보를 담아 서버에서 이미지 삭제정보가 있을 시 삭제 로직을 수행하면된다.

     

    이런식으로 처리하면 가비지 이미지파일을 처리할 수 있다.

    반응형

    댓글

Designed by Tistory.