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