-
스프링 게시판 - ckeditor4 (ck에디터)연동 - 이미지업로드 (2)Spring 2023. 3. 25. 15:18반응형
2023.03.18 - [Spring] - 스프링 게시판 - ckeditor4 (ck에디터)연동 - 기본적용 (1)
이번 포스트는 화면단 파일업로드 옵션 정의, 서버단 파일업로드 기능 구현을 하겠다.
저 이미지 모양을 클릭하면 이미지 업로드 기능을 사용 할 수 있다.
1. 화면단 스크립트 설정
CKEDITOR.replace( 'ckeditor', {//해당 이름으로 된 textarea에 에디터를 적용 width:'100%', height:'400px', filebrowserUploadUrl: "/bbs/ckeditor/ckEditorUpload", image_previewText: ' ' });
옵션중 width, height는 이미지 업로드의 팝업창 크기 설정,
filebrowserUploadUrl : 이미지파일 업로드를 하는 컨트롤러 호출 주소 정의
image_previewText : 미리보기의 기본 문구 정의하기. 사용을 하지 않기 때문에 공백으로 처리함
//이미지 업로드가 끝나고 실행하는 함수 CKEDITOR.on( 'dialogDefinition', function( ev ) { // Take the dialog name and its definition from the event data. let dialogName = ev.data.name; let dialogDefinition = ev.data.definition; let uploadTab = dialogDefinition.getContents( 'Upload' ); let uploadButton = uploadTab.get('uploadButton'); uploadButton['filebrowser']['onSelect'] = function( fileUrl, errorMessage ) { } });
위의 dialogDefinition 함수는 파일업로드가 완료 된 후 after행위를 할 수 있는 함수이다. 일단 정의만하고 나중에 다시 설명하겠다.
이 함수가 필요한 이유는 파일업로드 삭제와 관련있다.
스크립트 전체 부분
$(document).ready(function() { CKEDITOR.replace( 'ckeditor', {//해당 이름으로 된 textarea에 에디터를 적용 width:'100%', height:'400px', filebrowserUploadUrl: "/bbs/ckeditor/ckEditorUpload", image_previewText: ' ' }); //이미지 업로드가 끝나고 실행하는 함수 CKEDITOR.on( 'dialogDefinition', function( ev ) { // Take the dialog name and its definition from the event data. let dialogName = ev.data.name; let dialogDefinition = ev.data.definition; let uploadTab = dialogDefinition.getContents( 'Upload' ); let uploadButton = uploadTab.get('uploadButton'); uploadButton['filebrowser']['onSelect'] = function( fileUrl, errorMessage ) { } }); });
2. 파일업로드 컨트롤러 작성
먼저 pom.xml에 라이브러리를 추가해준다.
파일업로드 관련 라이브러리 및 josn형태로 리턴시 필요한 라이브러리이다.
<!-- json util for Google--> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.5</version> </dependency> <!-- fileUpload --> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.3</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.0</version> </dependency>
@ResponseBody @PostMapping("/ckeditor/ckEditorUpload") public void communityImageUpload(HttpServletRequest req, HttpServletResponse resp, MultipartHttpServletRequest multiFile) throws Exception{ PrintWriter printWriter = null; OutputStream out = null; MultipartFile file = multiFile.getFile("upload"); if(file != null) { if(file.getSize() >0 && StringUtils.isNotBlank(file.getName())) { if(file.getContentType().toLowerCase().startsWith("image/")) { try{ String fileName = file.getOriginalFilename(); byte[] bytes = file.getBytes(); String uploadPath = "C:/자신의프로젝트경로/src/main/webapp/resources/ckeditorUpload"; File uploadFile = new File(uploadPath); if(!uploadFile.exists()) { uploadFile.mkdir(); } String fileName2 = UUID.randomUUID().toString(); uploadPath = uploadPath + "/" + fileName2 +fileName; out = new FileOutputStream(new File(uploadPath)); out.write(bytes); printWriter = resp.getWriter(); String fileUrl = req.getContextPath() + "/resources/ckeditorUpload/" +fileName2 +fileName; //url경로 JsonObject json = new JsonObject(); json.addProperty("uploaded", 1); json.addProperty("fileName", fileName); json.addProperty("url", fileUrl); printWriter.print(json); }catch(IOException e){ e.printStackTrace(); } finally { if (out != null) { out.close(); } if (printWriter != null) { printWriter.close(); } } } } } }
일반적인 파일업로드 로직으로 이미지 파일을 업로드하는 방식이다.
다만 프로젝트 업로드 경로는 프로잭트 내부 폴더인 resouece폴더 하위 를 참조하고 있다.
소스 중간 json객체에 담기는 url 값이 이미지를 불러오는 경로이다.
3. 이미지 업로드 테스트
[서버로 전송] 버튼을 누르면 정의한 파일업로드 컨트롤러 주소로 멀티파트 객체를 보내 파일업로드를 수행한다.
업로드가 완료되면 json 객체에 담긴 url값이 출력된다.
[확인]버튼을 누르면 본문에 이미지가 삽입된다.
소스탭으로 보면 이미지 태그안에 이미지 경로가 있을 뿐이다.
이미지를 여러개 업로드해도 결국 이미지태그를 여러개 삽입하는것과 같다.
다음 포스트는 가비지 이미지파일 제거를 구현하겠다.
반응형'Spring' 카테고리의 다른 글
스프링 게시판 - ckeditor4 (ck에디터)연동 - 가비지이미지 삭제 (3) (0) 2023.04.02 스프링 게시판 - ckeditor4 (ck에디터)연동 - 기본적용 (1) (0) 2023.03.18 [파일업로드] 이미지 업로드시 엑박오류, 이상한 경로에 C:\...(생략)\.metadata\.plugins\ 저장된다면? (0) 2023.03.05 [Spring] 스프링 AOP를 이용해 트랜잭션(transaction) 처리하기 (0) 2022.06.27 [스프링] Spring Controller 컨트롤러 Ajax 데이터통신 유형 정리 (2) 2022.02.28