프로그래밍

summernote 붙여넣은 파일로 저장하기

서기㏇ 2021. 11. 23. 21:24
반응형

summernote에서 이미지들을 직접 붙여넣을 경우 base64인코딩 되는 형태로 전달되게 됩니다. 
이걸 바로 db에 저장해버리면..... 
용량이 어마무시 해지는데요.. 
그럴때 해당 내용중 이미지태그만 분리해서 별도의 파일로 저장하는 방법입니다.

   $detail=$_REQUEST['memo'];  // memo라는 필드로 값이 들어오게 될경우 
        
    //Prepare HTML & ignore HTML errors
    $dom = new \domdocument();
    $dom->loadHtml('<?xml encoding="utf-8" ?>'.$detail, LIBXML_NOWARNING | LIBXML_NOERROR);
                      // 인코딩을 넣지 않으면 한글이 깨지게 된다. 

    //identify img element   
    $images = $dom->getelementsbytagname('img');

     //loop over img elements, decode their base64 source data (src) and save them to folder,
    //and then replace base64 src with stored image URL.
    foreach($images as $k => $img){

        //collect img source data
        $data = $img->getattribute('src');

        //checking if img source data is image by detecting 'data:image' in string
        if (strpos($data, 'data:image')!==false){
            list($type, $data) = explode(';', $data);
            list(, $data)      = explode(',', $data);
            
            //decode base64
            $data = base64_decode($data);

            // 파일명을 랜덤으로 생성시킨다. 
            $image_name= date("YmdHis").rand(1000,9999).'.png';

            // 실제 이미지가 업로드될 경로 지정
            $path = './images/summernote/'. $image_name;

            // 링크에 사용될 이미지의 절대경로 
            $path2 = '/images/summernote/'. $image_name;

            file_put_contents($path, $data);

        
            $img->removeattribute('src');
            $img->setattribute('src', $path2);

        }  
       
    } 

    // 최종적인 결과물을 detail 변수에 넣어서 사용한다. 
    $detail = $dom->savehtml();
반응형