본문 바로가기

프로그래밍

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

반응형

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();
반응형