diff --git a/data/dataxml/uac.service.board.qna_GET.xml b/data/dataxml/uac.service.board.qna_GET.xml index 29ffb998..df27a4d4 100644 --- a/data/dataxml/uac.service.board.qna_GET.xml +++ b/data/dataxml/uac.service.board.qna_GET.xml @@ -14,7 +14,7 @@ 답변완료 myid@digitalship.co.kr 질문이 있습니다. - 111111=화면캡쳐.jpg;222222=화면캡쳐2.jpg; + F20210802052436092_0A84FA72B1B1478ABEB285536B81B587=엑셀샘플.xlsx;F20210802052436092_F1DB407F181A4B8AAA0859E56D4EDB57=엑셀샘플2.xlsx; 이렇게 답변 드립니다. 333333=결과확인.jpg; diff --git a/data/dataxml/uac.service.board.qna_PUT.xml b/data/dataxml/uac.service.board.qna_PUT.xml index 0fa64dcf..7e8a41f6 100644 --- a/data/dataxml/uac.service.board.qna_PUT.xml +++ b/data/dataxml/uac.service.board.qna_PUT.xml @@ -2,6 +2,12 @@ + + + 10 diff --git a/data/fileupload/bbs/qna/F20210802052436092_0A84FA72B1B1478ABEB285536B81B587 b/data/fileupload/bbs/qna/F20210802052436092_0A84FA72B1B1478ABEB285536B81B587 new file mode 100644 index 00000000..be14bd8a Binary files /dev/null and b/data/fileupload/bbs/qna/F20210802052436092_0A84FA72B1B1478ABEB285536B81B587 differ diff --git a/data/fileupload/bbs/qna/F20210802052436092_F1DB407F181A4B8AAA0859E56D4EDB57 b/data/fileupload/bbs/qna/F20210802052436092_F1DB407F181A4B8AAA0859E56D4EDB57 new file mode 100644 index 00000000..be14bd8a Binary files /dev/null and b/data/fileupload/bbs/qna/F20210802052436092_F1DB407F181A4B8AAA0859E56D4EDB57 differ diff --git a/data/fileupload/bbs/qna/F20210802052436092_F1F06656D13C451BA42E21B4028F3838 b/data/fileupload/bbs/qna/F20210802052436092_F1F06656D13C451BA42E21B4028F3838 new file mode 100644 index 00000000..be14bd8a Binary files /dev/null and b/data/fileupload/bbs/qna/F20210802052436092_F1F06656D13C451BA42E21B4028F3838 differ diff --git a/src/main/java/nlib/bbs/web/BoardController.java b/src/main/java/nlib/bbs/web/BoardController.java index 0e152ddc..021648d6 100644 --- a/src/main/java/nlib/bbs/web/BoardController.java +++ b/src/main/java/nlib/bbs/web/BoardController.java @@ -2,11 +2,13 @@ package nlib.bbs.web; import java.util.HashMap; +import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import org.apache.commons.collections.MapUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -19,6 +21,11 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + import nlib.bbs.service.BoardService; import nlib.cmm.NlibCommonController; import nlib.cmm.crypto.AriaCrypto; @@ -226,12 +233,17 @@ public class BoardController extends NlibCommonController * @return */ @RequestMapping("/board/insertQnAForm.do") - public String insertQnAForm(HttpServletRequest req, Authentication authentication, @RequestParam Map paramMap, ModelMap model) { + public String insertQnAForm(HttpServletRequest req, Authentication authentication + , @RequestParam Map paramMap + , ModelMap model) { + // 입력 매개변수 출력 설정 + addParamsToModel(paramMap, model); + NlibLoginVO loginVO = getNlibLoginVO(authentication); - model.addAttribute("regUserName", loginVO.getName()); - model.addAttribute("email", loginVO.getEmail()); - + if(StringUtil.isEmpty(paramMap.get("regUserName"))) model.addAttribute("regUserName", loginVO.getName()); + if(StringUtil.isEmpty(paramMap.get("email"))) model.addAttribute("regUserName", loginVO.getEmail()); + return "nlib/board/insertQnAForm"; } @@ -256,15 +268,55 @@ public class BoardController extends NlibCommonController reqVO.addInfoItem("email" , paramMap.get("email")); reqVO.addInfoItem("contentQeust", paramMap.get("contentQeust")); + String fileListJsonStr = paramMap.get("fileList"); + if(fileListJsonStr.startsWith("\"")) fileListJsonStr = fileListJsonStr.substring(1); + if(fileListJsonStr.endsWith("\"")) fileListJsonStr = fileListJsonStr.substring(0, fileListJsonStr.length()-1); + fileListJsonStr = fileListJsonStr.replaceAll("\\\\", ""); + + log.debug("fileList : " + fileListJsonStr); + + /* + ObjectMapper mapper = new ObjectMapper(); + List> fileList = null; + try { + fileList = mapper.readValue(fileListJsonStr, new TypeReference>>() { + }); + + for (Map map : fileList) { + MapUtils.debugPrint(System.out, "map", map); + } + + } catch (JsonMappingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (JsonProcessingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + log.debug("fileMap =" + fileList); + */ + reqVO.addInfoItem("fileList", fileListJsonStr); + // 요청 DataApiResVO resVO = boardService.insertQnA(reqVO); // 처리결과 확인 if(!resVO.isSuccess()) { message = resVO.getResultMessage(); + model.addAttribute("message", message); + addParamsToModel(paramMap, model, null, "pageIndex,pageSize,searchKeyword"); + addParamsToModel(paramMap, model, null, + "title,articlePassword," + + "regDate, regUserName, " + + "email, contentQeust"); + return "redirect:/board/insertQnAForm.do"; } + model.addAttribute("pageSize", paramMap.get("pageSize")); + model.addAttribute("message", "성공적으로 등록되었습니다."); + return "redirect:/board/listQnAs.do"; } diff --git a/src/main/java/nlib/cmm/NlibCommonController.java b/src/main/java/nlib/cmm/NlibCommonController.java index 89909936..df6f828c 100644 --- a/src/main/java/nlib/cmm/NlibCommonController.java +++ b/src/main/java/nlib/cmm/NlibCommonController.java @@ -64,7 +64,7 @@ public class NlibCommonController { * @return */ public NlibLoginVO getNlibLoginVO(Authentication authentication) { - if(authentication == null) return null; + if(authentication == null) return new NlibLoginVO(); return (NlibLoginVO)authentication.getPrincipal(); } @@ -210,6 +210,8 @@ public class NlibCommonController { } + if(existUpperMap) model.addAttribute(upperMapName, uppperMap); + return model; } diff --git a/src/main/java/nlib/cmm/fileupload/DownloadView.java b/src/main/java/nlib/cmm/fileupload/DownloadView.java new file mode 100644 index 00000000..052ba1a9 --- /dev/null +++ b/src/main/java/nlib/cmm/fileupload/DownloadView.java @@ -0,0 +1,72 @@ +package nlib.cmm.fileupload; + +import java.io.File; +import java.io.FileInputStream; +import java.io.OutputStream; +import java.net.URLEncoder; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.stereotype.Component; +import org.springframework.util.FileCopyUtils; +import org.springframework.web.servlet.view.AbstractView; + +@Component("downloadView") +public class DownloadView extends AbstractView { + + @Override + protected void renderMergedOutputModel(Map model, HttpServletRequest request, HttpServletResponse response) + throws Exception { + + File file = (File)model.get("downloadFile"); + if(file != null) { + String fileName =(String)model.get("fname"); + String userAgent = request.getHeader("User-Agent"); + + if(userAgent.indexOf("MSIE") > -1 || userAgent.indexOf("Trident") > -1){ + //fileName = URLEncoder.encode(file.getName(), "utf-8").replaceAll("\\+", "%20");; + }else if(userAgent.indexOf("Chrome") > -1) { + StringBuffer sb = new StringBuffer(); + for(int i=0; i '~') { + sb.append(URLEncoder.encode(""+c, "UTF-8")); + }else { + sb.append(c); + } + } + //fileName = sb.toString(); + }else { + //fileName = new String(file.getName().getBytes("utf-8")); + } + response.setContentType(getContentType()); + response.setContentLength((int)file.length()); + response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\";"); + response.setHeader("Content-Transfer-Encoding", "binary"); + + OutputStream out = response.getOutputStream(); + FileInputStream fis = null; + try { + fis = new FileInputStream(file); + FileCopyUtils.copy(fis, out); + } catch(Exception e){ + e.printStackTrace(); + }finally{ + if(fis != null){ + try{ + fis.close(); + }catch(Exception e){ + e.printStackTrace(); + } + } + + if(out != null) { + out.flush(); + } + } + + } + } +} \ No newline at end of file diff --git a/src/main/java/nlib/cmm/fileupload/FileUploadController.java b/src/main/java/nlib/cmm/fileupload/FileUploadController.java index 7b169677..e3501e34 100644 --- a/src/main/java/nlib/cmm/fileupload/FileUploadController.java +++ b/src/main/java/nlib/cmm/fileupload/FileUploadController.java @@ -23,6 +23,7 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.servlet.ModelAndView; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -69,14 +70,12 @@ public class FileUploadController { /** * 첨부파일이 저장되는 최상위 위치 */ - @Value("#{properties['fileupload.base.path']}") - private String FILEUPLOAD_BASE_PATH; + private String FILEUPLOAD_BASE_PATH = nlibProperty.getProperty("fileupload.base.path"); /** * 첨부파일 임시 저장 위치 */ - @Value("#{properties['fileupload.temp.subpath']}") - private String FILEUPLOAD_TEMP_SUBPATH; + private String FILEUPLOAD_TEMP_SUBPATH = nlibProperty.getProperty("fileupload.temp.subpath"); @ResponseBody @RequestMapping(value="/fileupload/uploadFilesAjax.do", produces="application/json") @@ -182,5 +181,20 @@ public class FileUploadController { return ret; } + @RequestMapping(value="/fileupload/downloadFiles.do") + public ModelAndView download(@RequestParam HashMap params, ModelAndView mv) { + String fid = (String) params.get("fid"); + String fname = (String) params.get("fname"); + String subPath = nlibProperty.getProperty((String) params.get("subPathKey")); + + String fullPath = FILEUPLOAD_BASE_PATH + "/" + subPath + "/" + fid; + File file = new File(fullPath); + + mv.setViewName("downloadView"); + mv.addObject("downloadFile", file); + mv.addObject("fname", fname); + + return mv; + } } diff --git a/src/main/java/nlib/security/SpringSecurityConfig.java b/src/main/java/nlib/security/SpringSecurityConfig.java index 1381fe13..1ead7ed9 100644 --- a/src/main/java/nlib/security/SpringSecurityConfig.java +++ b/src/main/java/nlib/security/SpringSecurityConfig.java @@ -53,6 +53,7 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter { .antMatchers("/temp/**") .antMatchers("/favicon/**") .antMatchers("/*/*Ajax.do") + .antMatchers("/fileupload/**") .antMatchers("/board/**") .antMatchers("/inform/**") .antMatchers("/alert/**") diff --git a/src/main/webapp/WEB-INF/jsp/nlib/board/insertQnAForm.jsp b/src/main/webapp/WEB-INF/jsp/nlib/board/insertQnAForm.jsp index 40f7b7fb..3630c36e 100644 --- a/src/main/webapp/WEB-INF/jsp/nlib/board/insertQnAForm.jsp +++ b/src/main/webapp/WEB-INF/jsp/nlib/board/insertQnAForm.jsp @@ -1,9 +1,9 @@ <% /** * - * @Class Name : listQnAs.jsp + * @Class Name : insertQnAForm.jsp * - * @Description : 묻고답하기 목록을 조회한다. + * @Description : 묻고답하기 등록화면을 표출한다. * * * @프로젝트명: 지방문화원 통합자료관리시스템 구축사업 (2021) @@ -31,7 +31,12 @@ <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %> -묻고답하기 - 글쓰기 +묻고답하기 - 등록 + + + + +${pageTitle} @@ -39,83 +44,164 @@ -${pageTitle } + + + + + +${pageTitle } + +메시지 : ${message } + + + + + + + + + + + + + + + + + 제목 + + + + 작성자 + + + + 비밀번호 + + * 비밀번호 : SHA-256 암호화 처리 후, DB에 저장되며, 웹 화면에 표출될 때는 Aria로 AuthKey를 Salt값으로 하여 재암호화처리하고 BASE64로 다시한번 인코딩하여 표출함 + + + + 이메일 + + + + 질문내용 + ${contentQeust} + + + + + + + + + + + + + - - - Drop files here or click to select files. - 이곳에 파일을 끌어다 놓거나, 클릭하여 올릴 파일을 선택하세요. - + + + Drop files here or click to select files. + 이곳에 파일을 끌어다 놓거나, 클릭하여 올릴 파일을 선택하세요. + - - + + diff --git a/src/main/webapp/WEB-INF/jsp/nlib/board/selectQnA.jsp b/src/main/webapp/WEB-INF/jsp/nlib/board/selectQnA.jsp index 5db2f3ec..a994cfcb 100644 --- a/src/main/webapp/WEB-INF/jsp/nlib/board/selectQnA.jsp +++ b/src/main/webapp/WEB-INF/jsp/nlib/board/selectQnA.jsp @@ -122,7 +122,16 @@ function fn_delete(passwd) { ${article.contentQeust} - ${article.contentQeustFile} + + <% + // 파일정보 : 저장파일ID=원파일명 + %> + + + + ${fInfo[1]} + + 답변내용 diff --git a/src/main/webapp/WEB-INF/jsp/nlib/board/updateQnAForm.jsp b/src/main/webapp/WEB-INF/jsp/nlib/board/updateQnAForm.jsp index a584fa4a..e555862f 100644 --- a/src/main/webapp/WEB-INF/jsp/nlib/board/updateQnAForm.jsp +++ b/src/main/webapp/WEB-INF/jsp/nlib/board/updateQnAForm.jsp @@ -100,7 +100,7 @@ function fn_update() { 작성자 - + 이메일 diff --git a/src/main/webapp/js/fileupload/dropzone.js b/src/main/webapp/js/fileupload/dropzone.js index c8a34081..9a43a0b2 100644 --- a/src/main/webapp/js/fileupload/dropzone.js +++ b/src/main/webapp/js/fileupload/dropzone.js @@ -117,7 +117,7 @@ url: null, method: "post", withCredentials: false, - parallelUploads: 2, + parallelUploads: 5, uploadMultiple: false, maxFilesize: 256, paramName: "file", @@ -127,12 +127,13 @@ //thumbnailHeight: 120, thumbnailHeight: 60, // NLIB filesizeBase: 1000, - maxFiles: null, + //maxFiles: null, + maxFiles: 3, // NLIB : 최대 업로드 가능한 파일수 params: {}, clickable: true, ignoreHiddenFiles: true, // acceptedFiles: null, - acceptedFiles: "image/*", // NLIB + acceptedFiles: "image/*,.hwp,.xls,.xlsx,.ppt,.pptx,.doc,.docx,.txt", // NLIB acceptedMimeTypes: null, //autoProcessQueue: true, autoProcessQueue: false, // NLIB @@ -142,17 +143,20 @@ previewsContainer: null, capture: null, dictDefaultMessage: "Drop files here to upload", - dictFallbackMessage: "파일 드래그앤드랍을 지원하지 않는 브라우저입니다.", // "Your browser does not support drag'n'drop file uploads.", + //dictFallbackMessage: "Your browser does not support drag'n'drop file uploads.", + dictFallbackMessage: "파일 드래그앤드랍을 지원하지 않는 브라우저입니다.", // NLIB dictFallbackText: "Please use the fallback form below to upload your files like in the olden days.", dictFileTooBig: "파일이 너무 큽니다({{filesize}}MiB). 최대 크기 {{maxFilesize}}MiB를 넘을 수 없습니다.", // "File is too big ({{filesize}}MiB). Max filesize: {{maxFilesize}}MiB.", - dictInvalidFileType: "You can't upload files of this type.", + //dictInvalidFileType: "You can't upload files of this type.", + dictInvalidFileType: "허용된 파일 형식만 첨부가능합니다 (이미지,문서 파일) ", // NLIB dictResponseError: "Server responded with {{statusCode}} code.", dictCancelUpload: "Cancel upload", dictCancelUploadConfirmation: "Are you sure you want to cancel this upload?", //dictRemoveFile: "Remove file", dictRemoveFile: "취소", // NLIB dictRemoveFileConfirmation: null, - dictMaxFilesExceeded: "You can not upload any more files.", + //dictMaxFilesExceeded: "You can not upload any more files.", + dictMaxFilesExceeded: "이파일은, 첨부 가능 최대 개수를 초과하여 업로드되지 않습니다.", // NLIB accept: function(file, done) { return done(); },
- * @Class Name : listQnAs.jsp + * @Class Name : insertQnAForm.jsp * - * @Description : 묻고답하기 목록을 조회한다. + * @Description : 묻고답하기 등록화면을 표출한다. * * * @프로젝트명: 지방문화원 통합자료관리시스템 구축사업 (2021) @@ -31,7 +31,12 @@ <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> <%@ taglib prefix="validator" uri="http://www.springmodules.org/tags/commons-validator" %> -묻고답하기 - 글쓰기 +묻고답하기 - 등록 + + + + +${pageTitle} @@ -39,83 +44,164 @@ -${pageTitle } + + + + + +${pageTitle } + +메시지 : ${message } + + +