Search

[스프링 게시판] 게시글 이미지 첨부

@3/22/2023

문제

토스트 UI를 사용하면 이미지를 Base64로 인코딩해서 문자열 형식으로 저장하고 렌더링하기 때문에 DB에 큰 부담을 줄 수 있음
따라서 게시글에 이미지를 첨부할 경우 서버 이미지 폴더에 저장한 후 주소를 통해 이미지 리소스를 전달해야 함

TOAST 에디터 hooks 함수

hooks 함수를 통해 에디터의 특정 동작에 대한 콜백함수를 지정할 수 있음
원래 에디터 JS
const Editor = toastui.Editor; const editor = new Editor({ el: document.querySelector('#editor'), height: '500px', initialEditType: 'WYSIWYG', previewStyle: 'vertical', language: "ko-KR" });
JavaScript
복사
이미지 추가 hooks 및 ajax 코드 추가
const Editor = toastui.Editor; const editor = new Editor({ el: document.querySelector('#editor'), height: '500px', initialEditType: 'WYSIWYG', previewStyle: 'vertical', language: "ko-KR", hooks: { addImageBlobHook: function(imageFile, editorCallback) { let formData = new FormData(); formData.append("image", imageFile); imageUploadAjax(formData, editorCallback); } } }); function imageUploadAjax(formData, editorCallback) { let request = new XMLHttpRequest(); request.onload = () => { editorCallback(request.responseText, "image"); }; request.open("POST", "/files/images/new", true); request.send(formData); }
JavaScript
복사
addImageBlobHook는 이미지를 추가할 때 호출할 함수를 지정할 수 있음
imageFile은 이미지 파일
callback은 이미지 url을 넣어주면 에디터에 이미지를 표시해주는 TOAST Editor의 콜백 함수

컨트롤러

@Controller @RequiredArgsConstructor @RequestMapping("/files") public class FileController { ... @ResponseBody @GetMapping("/images/{storedFileName}") public Resource downloadImage( @PathVariable String storedFileName ) throws MalformedURLException { return new UrlResource("file:" + filePath + storedFileName); } @ResponseBody @PostMapping("/images/new") public String uploadImage( @RequestParam("image") MultipartFile multipartFile ) throws IOException { if (multipartFile.isEmpty()) { return "not found"; } UploadFile uploadFile = fileManager.storeFile(multipartFile); String storedFileName = uploadFile.getStoredFileName(); return "/files/images/" + storedFileName; } ... }
Java
복사
동작 흐름
에디터에서 이미지 추가
addImageBlobHook에 지정한 함수 호출
첫번째 인자(imageFile)에 이미지 파일 객체, 두번째 인자에 에디터에 이미지를 표시하기 위한 콜백 함수(callback)가 들어옴
imageFile을 FormData 객체에 담아 ajax로 전송
ajax 통신이 성공하면 onload 콜백함수 내에서 에디터 callback 함수 호출
첫번째 파라미터로 이미지를 다운받을 url, 두번째 파라미터로 img 태그 alt 속성에 들어갈 내용 지정
에디터 콜백함수는 전달받을 url을 통해 이미지를 요청하고, 전달받은 이미지를 에디터 화면에 뿌려줌

References

관련 커밋

6939526594fdfa06adcd2568252c14d3937d2a01
commit