게시글을 쓸때 고려해야 할 사항을 우선 기술한다. 추후 글의 수정 및 삭제에 대하여 기술한다.
이 글을 작성하기 위하여 우선적으로 이해해야 할 사항은 엮인 글과 그에 엮인 글을 참고한다.
1. file_uploader_html5.jsp 수정사항
- 이 단계에서는 본문에 추가하기 위하여 사진 버튼을 누른 상태에서
- 사진 파일이 서버의 특정 위치 (upload)에 저장된 상태이다.
- 사진 파일에 대한 정보를 임시적으로 저장한다.
- 이 파일은 본문에 추가되는 사진 하나에 대하여 수행된다. 따라서 본문에 추가되는 사진이 여러 개일 경우 반복 수행된다.
- file_uploader_html5.jsp의 내용은 http://ksseo63.blog.me/220498584408을 참고한다.
AddRequest addRequest = new AddRequest();
addRequest.setFileName(name);
file = new File(storedFileName);
addRequest.setFileSize(file.length());
addRequest.setRealPath(storedFileName);
addRequest.setDescription("이미지"); // 첨부를 구별짓는 방법 : 1. 이미지, 2. 게시글
SmartEditorImageManager imageManager = SmartEditorImageManager.getInstance();
List<AddRequest> imageList = imageManager.getImageList();
if(imageList == null) {
imageList = new ArrayList<AddRequest>();
imageManager.setImageList(imageList);
}
imageList.add(addRequest);
1.1 AddRequest.java : 파일 정보를 저장하기 위해 필요한 정보를 저장하는 클래스
package com.talanton.homepage.pds.model;
public class AddRequest {
private String fileName;
private long fileSize;
private String realPath;
private String description;
private int articleId;
private boolean into = false;
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public long getFileSize() {
return fileSize;
}
public void setFileSize(long fileSize) {
this.fileSize = fileSize;
}
public String getRealPath() {
return realPath;
}
public void setRealPath(String realPath) {
this.realPath = realPath;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getArticleId() {
return articleId;
}
public void setArticleId(int articleId) {
this.articleId = articleId;
}
public boolean isInto() {
return into;
}
public void setInto(boolean into) {
this.into = into;
}
public PdsItem toPdsItem() {
PdsItem item = new PdsItem();
item.setFileName(fileName);
item.setFileSize(fileSize);
item.setRealPath(realPath);
item.setDescription(description);
item.setArticleId(articleId);
return item;
}
}
1.2 SmartEditorImageManager.java : 본문에 첨부되는 사진들에 대한 정보를 저장하는 클래스
package com.talanton.homepage.common.utilities;
import java.util.List;
import com.talanton.homepage.pds.model.AddRequest;
public class SmartEditorImageManager {
private static SmartEditorImageManager instance = new SmartEditorImageManager();
public static SmartEditorImageManager getInstance() {
return instance;
}
private SmartEditorImageManager() { }
private List<AddRequest> imageList = null;
public List<AddRequest> getImageList() {
return imageList;
}
public void setImageList(List<AddRequest> imageList) {
this.imageList = imageList;
}
public boolean isHasImage() {
return !imageList.isEmpty();
}
}
2. writeForm.js : form(submit) 버튼을 눌렀을 때, 실제 본문에 삽입된 사진을 처리하기 위하여 js에서 수행
//전송버튼 클릭이벤트
$("#addBtn").click(function(){
//id가 smarteditor인 textarea에 에디터에서 대입
editor_object.getById["smarteditor"].exec("UPDATE_CONTENTS_FIELD", []);
// 이부분에 에디터 validation 검증
var el = document.createElement('html');
el.innerHTML = editor_object.getById["smarteditor"].elPlaceHolder.value;
var imageF = el.getElementsByTagName('img');
var url = ctx + "/smarteditor/photo_uploader/popup/file_uploader_real.jsp";
var params = "";
for(var i = 0;i < imageF.length;i++) {
if(i == 0)
params += ("src=" + imageF[i].src + "&title=" + imageF[i].title);
else
params += ("&src=" + imageF[i].src + "&title=" + imageF[i].title);
}
sendRequest(url, params, callbackFunction, "POST");
callTimerProcessing();
})
// 본문에 삽입된 사진에 대한 처리(file_uploader_real.jsp)를 먼저하기 위하여 timer loop를 돌린다.
// 잘못하면 form(submit) 버튼을 처리하는 write.jsp가 먼저 수행될 수 있기 때문이다.
function callTimerProcessing() {
if(loop) {
setTimeout(function() {
callTimerProcessing();
}, 100);
}
else {
//폼 submit
$("#frm").submit();
}
}
3. file_uploader_real.jsp : Ajax에 의하여 불리며, 실제 본문에 삽입되는 파일에 대한 정보를 별도로 표시
<%@page import="com.talanton.homepage.pds.model.AddRequest"%>
<%@page import="java.util.List"%>
<%@page import="com.talanton.homepage.common.utilities.SmartEditorImageManager"%>
<%@page import="java.io.PrintWriter"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.addHeader("Cache-Control", "no-store");
response.setDateHeader("Expires", 1L);
request.setCharacterEncoding("utf-8");
String[] src = request.getParameterValues("src");
String[] title = request.getParameterValues("title");
SmartEditorImageManager imageManager = SmartEditorImageManager.getInstance();
List<AddRequest> imageList = imageManager.getImageList();
if(imageList != null) {
for(int i = 0;i < src.length;i++) {
int srcIndex = src[i].lastIndexOf("/");
String srcName = src[i].substring(srcIndex + 1);
for(int j = 0;j < imageList.size();j++) {
AddRequest addRequest = imageList.get(j);
String realPath = addRequest.getRealPath();
int addIndex = realPath.lastIndexOf("\\");
String addString = realPath.substring(addIndex + 1);
if(srcName.equals(addString)) {
addRequest.setInto(true);
break;
}
}
}
}
%>
4. write.jsp : form(submit) 버튼에 의하여 수행되는 jsp 파일
- 실제 본문에 삽입되는 사진 파일을 데이터베이스에 저장하고, 사진 첨부로 선택은 되었지만 사용자가 본문에서 삭제한 사진 파일은 서버의 저장공간에서 삭제한다. 데이터베이스에도 저장하지 않는다.
SmartEditorImageManager imageManager = SmartEditorImageManager.getInstance();
List<AddRequest> imageList = imageManager.getImageList();
if(imageList != null) {
for(int i = 0;i < imageList.size();i++) {
AddRequest addRequest = imageList.get(i);
if(addRequest.isInto()) {
addRequest.setArticleId(postedArticle.getId());
AddPdsItemService.getInstance().add(addRequest);
}
else {
File file = new File(addRequest.getRealPath());
if(file.exists()) {
file.delete();
}
}
}
imageManager.setImageList(null);
}
추후 수정과 삭제에 의하여 생기는 쓰레기를 처리한다. (스마트 에디터를 적용하고 나서 생기는 본문에 삽입되는 사진 파일에 대한 것은 아직 고려되지 않았다.)
[출처] 스마트 에디터 본문 사진 파일 쓰레기 처리방법|작성자 꿈을 이루는 요셉
'JQUERY > 플러그인' 카테고리의 다른 글
게시판에 스마트 에디터 적용시 garbage collection (0) | 2015.11.12 |
---|---|
스마트 에디터 적용방법 (0) | 2015.11.12 |
스마트에디터 사진을 업로더할 서버URL세팅 (0) | 2015.11.12 |
ckEditor 다운로드, 적용하기 (0) | 2015.11.06 |
CKEditor 에 커스텀 CSS ( Custom CSS ) 집어 넣기 (0) | 2015.11.06 |
jQuery와 FCKEditor를 연동하여 웹에디터를 구현하는 jQuery FCKEditor 플러그인 소개 (0) | 2015.10.29 |
Jstree 사용해서 그룹 트리 만들기 (0) | 2015.10.27 |
jQuery bPopup (팝업 플러그인) (0) | 2015.10.13 |