
controller
@ResponseBody
@RequestMapping(value="/uploadSummernoteImageFile.do", method=RequestMethod.POST, produces = "application/json; charset=utf8")
public String uploadSummernoteImageFile( @RequestParam("file") MultipartFile multipartFile,
@RequestParam(value="writer", defaultValue="modify") String writer,
@RequestParam(value="boardMyhomeArticleNo", defaultValue="0") int Article,
HttpServletRequest request ) throws Exception {
JsonObject jsonObject = new JsonObject();
System.out.println("writer야 넘어왔니? : " + writer);
System.out.println("Article야 넘어왔니? : " + Article);
// 새 글 번호 가져오기
if(writer.equals("writer")) {
Article = myhomeService.selectNewMyHomeNO();
}
System.out.println("이미지 폴더 명에 넣을 새글 번호 : " + Article);
// String fileRoot = request.getSession().getServletContext().getRealPath("/resources/images/board/"); // 내부경로 저장
String fileRoot = "C:\\\\gami\\\\board\\\\board_myhome\\\\" + Article + "\\\\"; // 외부 경로 저장
String originalFileName = multipartFile.getOriginalFilename(); // 원래 파일명
System.out.println(originalFileName);
String extension = originalFileName.substring(originalFileName.lastIndexOf(".")); // 파일 확장자 확인
System.out.println(extension);
final String[] ALLOW_EXTENSION = {".gif",".GIF", ".jpg",".JPG",".png",".PNG",".jepg",".JEPG"}; // 확장자 검사
if(!Arrays.asList(ALLOW_EXTENSION).contains(extension)){
jsonObject.addProperty("responseCode", "extension");
String check = jsonObject.toString();
System.out.println(check);
return check;
}
String savedFileName = UUID.randomUUID() + extension; // 파일 이름 새로 부여 : UUID
System.out.println(savedFileName);
File targetFile = new File(fileRoot + savedFileName);
try {
InputStream fileStream = multipartFile.getInputStream();
FileUtils.copyInputStreamToFile(fileStream, targetFile);
// 파일 저장
// jsonObject.addProperty("url", fileRoot + savedFileName); // contextroot + resources + 저장할 내부 폴더명
System.out.println(fileRoot + savedFileName);
System.out.println("떠라 제발 : " + Article + savedFileName);
jsonObject.addProperty("fileName", "\\\\" + Article + "\\\\" + savedFileName); // 톰켓 서버.xml에서 경로 설정해줬기에 게시글 번호 폴더명과 파일명을 같이 넘겨야함.
jsonObject.addProperty("responseCode", "success");
} catch (IOException e) {
FileUtils.deleteQuietly(targetFile); // 업로드 실패 시 하위 파일 및 폴더 삭제
jsonObject.addProperty("responseCode", "error");
e.printStackTrace();
}
String check = jsonObject.toString();
return check;
}
// 작성과 수정 컨트롤러 중...
// 폴더에 존재하지 않은 파일 삭제
int boardMyhomeArticleNo = newArticle;
myhomeDomain = myhomeService.selectMyHome(boardMyhomeArticleNo); // 게시글 조회
String fileRoot = "C:\\\\gami\\\\board\\\\board_myhome\\\\" + boardMyhomeArticleNo + "\\\\"; // 외부 경로
// 위 경로로 파일 객체 생성
File saveFileDir = new File(fileRoot);
// 파일 목록들을 배열에 담음.
String[] saveFileList;
// 파일 목록들을 배열에 담음.
if(saveFileDir.exists()) {
saveFileList = saveFileDir.list();
// for문을 돌려서 작성된 글 내용에 파일이 포함되었나 확인
for(String saveFileName: saveFileList) {
System.out.println(saveFileName);
boolean Check = myhomeDomain.getBoardMyhomeContents().contains(saveFileName);
System.out.println("사진 포함 여부 : " + Check);
// 만약 글내용에 포함되어 있지 않다면 해당 파일 삭제.
if(myhomeDomain.getBoardMyhomeContents().contains(saveFileName)==false) {
fileRoot = "C:\\\\gami\\\\board\\\\board_myhome\\\\" + newArticle + "\\\\" + saveFileName;
saveFileDir = new File(fileRoot);
FileUtils.deleteQuietly(saveFileDir);
}
}
}
myHomeForm.jsp
// 이미지 저장
function uploadSummernoteImageFile(file, el) {
var writer = 'writer';
let data = new FormData();
data.append("file", file);
data.append("writer", writer);
$.ajax({
data : data,
type : "POST",
url : "/gami/board/board_myhome/uploadSummernoteImageFile.do",
contentType : false,
enctype : 'multipart/form-data',
processData : false,
success : function(data) {
alert(data.responseCode);
alert("/board_myhome" + data.fileName);
if(data.responseCode == "success") {
setTimeout(function () {
// 톰켓 서버.xml에 로컬 경로 설정한 변수명 + 파일명 = 로컬 주소
$(el).summernote('insertImage', "/board_myhome" + data.fileName, function ($image) {
$image.css('width', "20%");
});
}, 0);
}else if(data.responseCode == "extension"){
alert("gif,jpg,png만 가능합니다.");
return false;
}else{
alert("파일 업로드에 실패 하였습니다.");
return false;
}
}
});
}
// 이미지 삭제
function deleteFile(fileName) {
var writer = 'writer';
$.ajax({
url: "/gami/board/board_myhome/deleteSummernoteImageFile.do", // 서버에 요청을 보낼 URL
type: "POST",
data: { file: fileName,
writer: writer},
success: function(response) {
let data = JSON.parse(data); // 서버에서 받은 JSON 응답 처리
if (data.responseCode === "success") {
alert("이미지가 삭제되었습니다.");
// 본문에서 이미지 삭제
$("img[src$='" + fileName + "']").remove();
} else {
alert("이미지 삭제에 실패하였습니다.");
}
}
});
}
<script>
$("#summernote").summernote({
// 에디터 높이
height: 600,
placeholder:"여기에 내용을 입력하세요.",
// 에디터 한글 설정
lang: "ko-KR",
// 에디터에 커서 이동 (input창의 autofocus라고 생각하시면 됩니다.)
focus : true,
toolbar: [
// 스타일 설정
['style', ['style']],
// 글꼴 설정
['fontname', ['fontname']],
// 글자 크기 설정
['fontsize', ['fontsize']],
// 굵기, 기울임꼴, 밑줄,취소 선, 서식지우기
['style', ['bold', 'italic', 'underline','strikethrough', 'clear']],
// 글자색
['color', ['forecolor','color']],
// 표만들기
['table', ['table']],
// 글머리 기호, 번호매기기, 문단정렬
['para', ['ul', 'ol', 'paragraph']],
// 줄간격
['height', ['height']],
// 그림첨부, 링크만들기, 동영상첨부
['insert',['picture','link','video']],
// 코드보기, 확대해서보기, 도움말
['view', ['codeview','fullscreen', 'help']]
],
callbacks : {
onImageUpload : function(files, editor, welEditable) { // 파일 업로드(다중업로드를 위해 반복문 사용)
for (var i = files.length - 1; i >= 0; i--) {
uploadSummernoteImageFile(files[i], this);
}
},
/* onChange:function(contents, $editable){ //텍스트 글자수 및 이미지등록개수
setContentsLength(contents, 0);
} */
},
fontNames: ['Arial', 'Arial Black', 'Comic Sans MS', 'Courier New','맑은 고딕','궁서','굴림체','굴림','돋음체','바탕체'], // 추가한 글꼴
// 추가한 폰트사이즈
fontSizes: ['8','9','10','11','12','14','16','18','20','22','24','28','30','36','50','72']
});
</script>