일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 백준문제
- 오류
- 자바
- 스프링
- 티스토리 블로그
- jsp
- ORA-01407
- 오라클
- ORA-02292
- 순환문
- Oracle
- 별 찍기
- 이클립스
- while
- 설정
- for문
- 공부
- 파워서플라이
- 백준
- 백준문제풀이
- 전화번호부
- 환경설정
- 오류모음
- 무결성 제약조건
- 이클립스단축기
- 인터페이스
- Ajax
- spring
- MSI
- 깃허브 블로그
Archives
- Today
- Total
danDevlog
Spring - 17 (첨부파일-3) 본문
728x90
게시물 수정시 첨부파일도 수정할 수 있도록 코드를 추가한다.
기존의 get.jsp와 register.jsp 에서 했던 코드에서 조금씩만 변형해서 사용하고있다.
modify.jsp
<!-- 첨부파일 표시 -->
<br>
<div class="row">
<div class="col-lg-12">
<div class="panel panel-default">
<div class="panel-body">
<div class="form-group uploadDiv">
파일 첨부 : <input type="file" name="uploadFile" multiple>
</div>
<div class="uploadResult">
<ul></ul>
</div>
</div>
</div>
</div>
</div>
<script>
$(document).ready(function(){
var formObj = $("#modifyForm"); // 문서중 form 요소를 찾아서 변수에 할당
/* var iform = $("#infoForm"); */
$('button').on("click", function(e) {
// 버튼이 클릭된다면 아래 함수 수행, e라는 이벤트 객체를 전달하면서
e.preventDefault(); // 기본 이벤트 동작 막기.
var operation = $(this).data("oper");
// 버튼에서 oper 속성 읽어서 변수에 할당.
console.log(operation);
// 브라우저 로그로 oper값 출력
if(operation === 'remove'){
formObj.attr("action", "/board/remove");
// form에 액션 속성을 변경
} else if (operation === 'list'){
/* iform.find("#bno").remove();
iform.attr("action", "/board/list"); */
var PageNumTag = $("input[name='pageNum']");
var amountTag = $("input[name='amount']");
var keyword = $("input[name='keyword']");
var typetag = $("input[name='type']");
formObj.attr("action", "/board/list").attr("method","get");
formObj.empty(); // 폼의 내용들 비우기.
/* 폼의 내용을 비우고 재설정 하는 이유는, 목록 이동시 게시물의 제목, 내용, 작성자 등은 전달할 필요X */
formObj.append(PageNumTag);
formObj.append(amountTag);
formObj.append(keyword);
formObj.append(typetag);
}
// 수정 처리에 대한 추가 구현 시작.
else if(operation === "modify"){
var str ="";
$(".uploadResult ul li").each(function(i,obj){
var jobj=$(obj);
console.log(jobj.data("filename"));
str+="<input type='hidden' name='attachList[";
str+=i+"].fileName' value='"+jobj.data("filename");
str+="'>";
str+="<input type='hidden' name='attachList[";
str+=i+"].uuid' value='"+jobj.data("uuid");
str+="'>";
str+="<input type='hidden' name='attachList[";
str+=i+"].uploadPath' value='"+jobj.data("path");
str+="'>";
str+="<input type='hidden' name='attachList[";
str+=i+"].fileType' value='"+jobj.data("type");
str+="'>";
});
formObj.append(str);
}
// 수정 처리에 대한 추가 구현 끝
formObj.submit();
// 위의 조건이 아니라면 수정 처리.
}); // end button event
// 첨부파일 목록, 삭제, 추가.
(function(){
var bno='<c:out value="${board.bno}"/>';
// 화면상에 공유된 bno 값 가져와 사용 준비.
$.getJSON("/board/getAttachList"
,{bno:bno}, function(arr){
console.log(arr);
var str="";
$(arr).each(function(i,attach){
var fileCallPath
= encodeURIComponent(attach.uploadPath
+"/"+attach.uuid+"_"+attach.fileName);
str+="<li data-path='";
str+=attach.uploadPath+"' data-uuid='";
str+=attach.uuid+"' data-filename='";
str+=attach.fileName+"' data-type='";
str+=attach.fileType+"'><div>";
str+="<img src='/resources/img/dan.jpg' width='20' height='20'>";
str+="<span>"+attach.fileName+"</span> ";
str+="<b data-file='"+fileCallPath;
str+="' data-type='file'>[x]</b>";
str+="</div></li>";
});
$(".uploadResult ul").html(str);
});
})();// 첨부파일 목록 표시 스크립트 끝
/* $("#list_btn").on("click", function(e){
iform.find("#bno").remove();
iform.attr("action", "/board/list");
iform.submit();
}); */
// 첨부파일 x버튼을 눌렀을때 처리 스크립트
$(".uploadResult").on("click","b",function(e){
console.log("delete file");
var delConfirm
= confirm('선택한 파일을 삭제 하시겠습니까?\n확인을 선택하면 복구 불가 합니다.');
if(delConfirm){
var targetFile=$(this).data("file");
var type=$(this).data("type");
var targetLi=$(this).closest("li");
$.ajax({
url : '/deleteFile',
data : {
fileName : targetFile,
type : type
},
dataType : 'text',
type : 'POST',
success : function(result){
alert(result);
targetLi.remove();
}
});
}else{
return;
}
});// 첨부 파일 일부 삭제 처리 끝
// 첨부파일 등록과 표시 시작
var regex = new RegExp("(.*?)\.(exe|sh|zip|alz)$");
// 정규표현식. 일부 파일의 업로드 제한. 필터,
// https://regexper.com/
var maxSize = 5242880; // 5MB
function checkExtension(fileName, fileSize) {
if (fileSize >= maxSize) {
alert("파일 크기 초과");
return false;
}
if (regex.test(fileName)) {
alert("해당 종류의 파일은 업로드 불가.");
return false;
}
return true;
}
$("input[type='file']").change(function(e) {
// 첨부파일 정보를 변경 한다면,
var formData = new FormData();// 스크립트의 폼 객체.
// 폼에 담고 있지만, 기존과 동일한 항목과 값의 형태로 처리.
var inputFile = $("input[name='uploadFile']");// 화면의 파일 요소를 변수에 할당.
var files = inputFile[0].files;
// .files 를 이용하면 배열로 파일 값들을 리턴.
for (var i = 0; i < files.length; i++) {
if (!checkExtension(
files[i].name,
files[i].size)) {
return false;
}
formData.append("uploadFile",
files[i]);
// 확장자와 크기가 지정한 규격에 맞다면, 폼에 해당 파일 정보를 추가.
}
$.ajax({
url : '/uploadAjaxAction',
processData : false,
contentType : false,
data : formData, // 실제 2진 데이터 전송이 아니고, 파일관련 정보만 전송.
type : 'post',// 첨부파일 처리는 get 방식은 불가.
dataType : 'json',
success : function(result) {
console.log(result);
showUploadResult(result);
// 첨부파일 업로드 결과를 json으로 받으면,
// 그 내용을 화면에 표시
}
});
});// end_upload_change
function showUploadResult(uploadResultArr) {
if (!uploadResultArr || uploadResultArr.length == 0) {
// json 처리 결과가 없다면 함수 종료.
return;
}
var uploadUL = $(".uploadResult ul");
var str = "";
// each 구문은 전달된 배열의 길이 만큼,
// each 이후의 함수를 반복 처리.
$(uploadResultArr).each(function(i, obj) {
var fileCallPath = encodeURIComponent(obj.uploadPath
+ "/" + obj.uuid + "_" + obj.fileName);
// encodeURIComponent :
// uri 로 전달되는 특수문자의 치환.
// & ?
var fileLink = fileCallPath.replace(new RegExp(/\\/g), "/");
// 전달되는 값들 중에서 역슬러시를 찾아서 슬러시로 변경.
str += "<li data-path='";
str += obj.uploadPath+"' data-uuid='";
str += obj.uuid+"' data-filename='";
str += obj.fileName+"' data-type='";
str += obj.image+"'><div>";
str += "<img src='/resources/img/attach.png' width='20' height='20'>";
str += "<span>" + obj.fileName + "</span> ";
str += "<b data-file='"+fileCallPath;
str += "' data-type='file'>[x]</b>";
str += "</div></li>";
});
uploadUL.append(str);
}// end_showUploadResult
});
</script>
BoardServiceImp
@Override
public BoardVO get(Long bno) {
log.info("get......" + bno);
return mapper.read(bno);
}
@Transactional
@Override
public boolean modify(BoardVO board) {
log.info("modify......" + board);
boolean modifyResult = false; // 게시물 수정 성공 여부.
modifyResult = mapper.update(board) == 1;
int attachList = 0;// 첨부파일 갯수.
if (board.getAttachList() != null) {
attachList = board.getAttachList().size();
}
long bno = board.getBno();
attachMapper.deleteAll(bno);
// 파일은 삭제 했어도, 디비 정보가 남아 있는 부분을 해소.
if (modifyResult && attachList > 0) {
// 등록하려는 첨부파일 목록(11,22)
List<BoardAttachVO> inputList = board.getAttachList();
// 디비에 등록되어 있는 첨부파일 목록(22,33)
// List<BoardAttachVO> dbList = attachMapper.findByBno(board.getBno());
for (BoardAttachVO bav : inputList) {
bav.setBno(bno);
attachMapper.insert(bav);
}
}
return modifyResult;
}
기존 첨부파일 전의 수정기능의 boolean을 토대로 첨부파일 기능을 추가하였다.
먼저 해당 게시물의 첨부파일 갯수를 구하고 attachList변수에 저장한다.
수정버튼을 눌렀다면 해당 modify 메소드가 작동되는것이므로, 첨부파일을 수정했건 안했던 일단 디비의 내용은 삭제해준다. 그 후 modifyResult가 true, attachList가 1 이상이면 inputList에 게시물의 첨부파일들을 List에 집어넣고,
순환문으로 해당 첨부파일들을 데이터베이스에 추가한다.
'Spring 게시판 만들기' 카테고리의 다른 글
Spring - 19 (스프링 시큐리티 - 2) (0) | 2022.05.02 |
---|---|
Spring - 18 (스프링 시큐리티) (0) | 2022.04.29 |
Spring - 16 (첨부파일 - 2) (0) | 2022.04.29 |
Spring - 15 (첨부파일) (0) | 2022.04.26 |
Spring - 14 (댓글 페이징) (0) | 2022.04.26 |
Comments