관리 메뉴

투덜이 개발자

PHP 5.3.27 구버전 에디터 내 base64 인코딩 이미지 파일로 저장하기 본문

Program Language/PHP

PHP 5.3.27 구버전 에디터 내 base64 인코딩 이미지 파일로 저장하기

엠투 2025. 2. 7. 16:29
반응형

PHP 5.3.27 구버전 에디터 내 base64 인코딩 이미지 파일로 저장하기

 

summernote 내 이미지 첨부하면 base64 인코딩 되어 저장된다.

 

이것을 파일로 저장할려고 한다.

php 버전을 업데이트 하면 좋겠지만 상황이 여의치 않아 php 버전이 오래된 버전이라 상당히 힘들었다.

 

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Summernote</title>
	<link href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
	<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>
	<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
	<link href="https://cdn.jsdelivr.net/npm/summernote@0.9.0/dist/summernote.min.css" rel="stylesheet">
	<script src="https://cdn.jsdelivr.net/npm/summernote@0.9.0/dist/summernote.min.js"></script>
</head>
<body>
<form name="theForm" method="post" action="./write.php" ENCTYPE="multipart/form-data" onsubmit="return false;">
	<INPUT TYPE="hidden" name='mode' value='save'>
	<textarea name="content" id="summernote">
		<p>Hello Summernote</p>
	</textarea>
	<div>
		<input type="button" class="submit2" value=" 전 송 " onclick="form_submit(this.form); return false;">
	</div>
</form>
<script>
	$(document).ready(function () {
		$('#summernote').summernote({
			height: 300,                 // 에디터 높이
			minHeight: null,             // 최소 높이
			maxHeight: null,             // 최대 높이
			focus: true,                  // 에디터 로딩후 포커스를 맞출지 여부
			lang: "ko-KR",					// 한글 설정
			placeholder: '내용을 입력하세요.'	//placeholder 설정
		});
	});
	
	function form_submit(f) {
		
		if (confirm("전송하시겠습니까?")) {
			f.submit();
			return true;
		}
	}
</script>
</body>
</html>

 

<?php
	header("Content-Type: text/html; charset=UTF-8");
	
	$content = $_POST['content'];
	
	if (get_magic_quotes_gpc()) {
		$content = stripslashes($content);
	}
	
	$uploadDir = 'uploads/';
	if (!is_dir($uploadDir)) {
		mkdir($uploadDir, 0755, true);
	}
	
	$pos = strpos($content, '<img');
	while ($pos !== false) {
		$endPos = strpos($content, '>', $pos);
		if ($endPos === false || $endPos >= strlen($content)) break; // 태그 닫힘 위치가 없거나 비정상적이면 중단
		
		$imgTag = substr($content, $pos, $endPos - $pos + 1);
		
		$srcPos = strpos($imgTag, 'src="');
		if ($srcPos !== false) {
			$srcStart = $srcPos + 5; // src=" 이후 시작 위치
			$srcEnd = strpos($imgTag, '"', $srcStart); // 닫는 따옴표 위치 찾기
			if ($srcEnd !== false) {
				$imgSrc = substr($imgTag, $srcStart, $srcEnd - $srcStart);
				
				// Base64 데이터인지 확인
				if (strpos($imgSrc, 'data:image') === 0 && strpos($imgSrc, ';base64,') !== false) {
					// MIME 타입 및 데이터 추출
					$base64Parts = explode(';base64,', $imgSrc);
					$mimeType = str_replace('data:', '', $base64Parts[0]); // 예: image/jpeg
					$base64Data = trim($base64Parts[1]); // 공백 제거
					
					// 파일 확장자 확인
					$extension = '';
					if (strpos($mimeType, 'jpeg') !== false || strpos($mimeType, 'jpg') !== false) {
						$extension = 'jpg';
					} elseif (strpos($mimeType, 'png') !== false) {
						$extension = 'png';
					} elseif (strpos($mimeType, 'gif') !== false) {
						$extension = 'gif';
					} elseif (strpos($mimeType, 'bmp') !== false) {
						$extension = 'bmp';
					} elseif (strpos($mimeType, 'webp') !== false) {
						$extension = 'webp';
					} else {
						$pos = strpos($content, '<img', $pos + 1); // 다음 검색 위치 정확히 지정
						continue;
					}
					
					// Base64 데이터 디코딩 및 파일 저장
					$imageData = base64_decode($base64Data);
					if ($imageData === false) {
						$pos = strpos($content, '<img', $pos + 1);
						continue; // 디코딩 실패 시 건너뜀
					}
					
					// 고유한 파일 이름 생성
					$fileName = uniqid() . '.' . $extension;
					$filePath = $uploadDir . $fileName;
					
					// 파일 저장
					if (file_put_contents($filePath, $imageData) !== false) {
						// HTML 콘텐츠 내의 src 파일 경로 변경
						$content = str_replace($imgSrc, $filePath, $content);
					}
				}
			}
		}
		
		// 다음 <img> 태그 찾기 (공백/개행 고려)
		if (preg_match('/<img\s/i', $content, $match, PREG_OFFSET_CAPTURE, $pos + 1)) {
			$pos = $match[0][1];
		} else {
			break; // 더 이상 <img> 태그가 없으면 루프 종료
		}
	}
	
	// 결과 반환
	header('Content-Type: application/json');
	echo json_encode(array(
		'status' => 'success',
		'content' => $content
	));
?>
반응형