테스트 사이트 - 개발 중인 베타 버전입니다

에디터에 base64 이미지 가져오면 png로 저장하여 주는 거

· 1년 전 · 1265 · 3

welcome 님이 미완성으로 둔 거 수정해 봤습니다. 원글은 이거..   https://sir.kr/g5_tip/21124

그냥 적용해 봤더니 그림 파일이 폭주하더군요... 저도 이 기능이 꼭 필요해서...  화면을 shift-win-s 해서 crop 해서 clipboard 넣었다가 에디터에 ctrl-v 해서 붙여 넣어서 쓸 때 쓰는 겁니다. 화면을 캡쳐해서 그림판 열어서 png로 저장하고 그림 불러넣고 하는 절차를 줄여줍니다.

 

별로 수정한 건 없습니다. 거의 그대롭니다.

 

{그누보드5 root}/extend/user.config.php 에 아래 내용 들어가고,,, 보시면 base64_to_file()은 welcome님 쓰신거 그대로고, base64_content_image() 부분만 약간 손봤습니다. preg_match 대신 preg_match_all 하면 한번에 내부 base64 이미지 전부 찾을 수 있긴 할텐데, 큰 차이는 없을거 같아서 그냥 loop 돌렸습니다. 어차피 preg_match_all 도 하나 찾고 다음에서 또 찾아가는 거니 뭐... 

 

<?php
function base64_to_file($base64_string, $extension) {
    $ym = date('ym', G5_SERVER_TIME);
    $data_dir = G5_DATA_PATH.'/editor/'.$ym;
    $data_url = G5_DATA_URL.'/editor/'.$ym;
    if(!is_dir($data_dir)) {
        @mkdir($data_dir, G5_DIR_PERMISSION);
        @chmod($data_dir, G5_DIR_PERMISSION);
    }
    $filename = basename($path);
    $chars_array = array_merge(range(0,9), range('a','z'), range('A','Z'));
    shuffle($chars_array);
    $shuffle = implode('', $chars_array);
    $file_name = abs(ip2long($_SERVER['REMOTE_ADDR'])).'_'.substr($shuffle,0,8).'_'.replace_filename($filename);
    $save_dir = sprintf('%s/%s', $data_dir, $file_name.".".$extension);
    $save_url = sprintf('%s/%s', $data_url, $file_name.".".$extension);    
    
    // open the output file for writing
    $ifp = fopen( $save_dir, 'wb' ); 
    // split the string on commas
    // $data[ 0 ] == "data:image/png;base64"
    // $data[ 1 ] == <actual base64 string>
    $data = explode( ',', $base64_string );
    // we could add validation here with ensuring count( $data ) > 1
    fwrite( $ifp, base64_decode( $data[ 1 ] ) );
    // clean up the file resource
    fclose( $ifp ); 
    return $save_url; 
}

function base64_content_image($content) {
    if(!$content) return;
    $content = stripslashes($content);
    $pattern = "#data:image/(gif|png|jpeg);base64,([\w=+/]++)#";
	while( true ) {
		preg_match($pattern, $content, $match);
		if (isset($match[0]))
		{
			// 이미지 데이터
			$imgdata = $match[0];
			// 확장자
			$extension = explode(";", explode("/", $match[0])[1])[0];        
			$image = base64_to_file($imgdata, $extension); 
			//$image = "<p><img src='".$image."'></p>";
			if ($image) {
				$content = str_replace($match[0], $image, $content);
			}
		}
		else break;
	}
    $content = addslashes($content);
    return $content;
}

?>

 

 

그리고, 저는 basic 테마를 쓰고 있어서, welcome 님은 무슨 skin 파일을 수정하라고 하셨는데, 그걸 저는 찾을 수가 없어서...  {그누보드5 root}/bbs/write_update.php를 수정했습니다.

 

원래는 아래...

if (isset($_POST['wr_content'])) {
    $wr_content = substr(trim($_POST['wr_content']),0,65536);
    $wr_content = preg_replace("#[\\\]+$#", "", $wr_content);
}

 

제가 수정한 건 ...

if (isset($_POST['wr_content'])) {
	$wr_content = trim($_POST['wr_content']);
	$wr_content = preg_replace("#[\\\]+$#", "", $wr_content);
	$wr_content = base64_content_image($wr_content);
	$wr_content = substr($wr_content,0,65536);
}

 

base64로 이미지가 많이 들어갔는데 거기서 먼저 substr으로 65536까지만 빼버리면 혹시나 그림이 잘릴지도 모르고 해서 순서를 좀 바꿨습니다.

 

그랬더니 그림도 잘 올라가고, 잘 됩니다.

 

 

 

 

 

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

댓글 3개

감사합니다.

감사합니다. 적용해 보니, 잘 되네요~^^최고!

1년 전

감사합니다 

게시글 목록

번호 제목
23966
23963
23953
23949
23938
23935
23933
23928
23919
23918
23917
23910
23902
23901
23897
23894
23893
23891
23885
23872
23870
23862
23859
23853
23845
23838
23827
23819
23805
23801