@ mavenBoard 만들기 5 (파일 게시판 만들기2)
1. 파일 목록 출력
- boardMapper.xml
<!-- 첨부파일 조회 -->
<select id="getFileList" parameterType="int" resultType="hashMap">
SELECT FILE_NO,ORG_FILE_NAME,ROUND(FILE_SIZE/1024,1) AS FILE_SIZE FROM MP_FILE
WHERE BNO = #{BNO} AND DEL_GB = 'N'
</select>
ROUND 함수는 특정 소수점을 반올림하고 나머지를 버리는 함수(소수점을 반올림하지 않고 절사만 원한다면
TRUNC 함수를 사용). ROUND를 이용하여 1024로 파일크기를 나누어 1024당 1로 계산. 소수점 첫번째 자리수까지
표시하는 것이며 두번째 소수점을 반올림.
- BoardService.java
public List<Map<String,Object>> getFileList(int bno) {
List<Map<String,Object>> lists = sqlSessionTemplate.selectList("boardMapper.getFileList",bno);
return lists;
}
- BoardController.java
@RequestMapping("/detail.ino")
public ModelAndView detail(HttpServletRequest request) {
int bno = Integer.parseInt(request.getParameter("bno"));
BoardDTO dto = boardService.getDetailByNum(bno);
List<Map<String,Object>> lists = boardService.getFileList(bno);
ModelAndView mav = new ModelAndView();
mav.setViewName("detail");
mav.addObject("dto",dto);
mav.addObject("file",lists);
return mav;
}
- detail.jsp
<div style="width: 150px; float: left;">파일 다운로드 :</div>
<div style="width: 500px; float: left;" align="left">
<c:forEach var="file" items="${file }">
<a href="#" onclick="fn_fileDown('${file.FILE_NO}'); return false;">${file.ORG_FILE_NAME}</a>(${file.FILE_SIZE}kb)<br/>
</c:forEach>
</div>
2. 파일 다운로드
- boardMapper.xml
<!-- 첨부파일 다운 -->
<select id="selectFileInfo" resultType="map" parameterType="map" >
SELECT STORED_FILE_NAME,ORG_FILE_NAME FROM MP_FILE
WHERE FILE_NO = #{FILE_NO}
</select>
- BoardService.java
public Map<String,Object> getFileInfo(Map<String,Object> map) {
return sqlSessionTemplate.selectOne("boardMapper.getFileInfo", map);
}
- BoardController.java
@RequestMapping("/fileDown.ino")
public void fileDown(@RequestParam Map<String,Object> map,HttpServletResponse response) throws Exception {
Map<String, Object> resultMap = boardService.getFileInfo(map);
String storedFileName = (String) resultMap.get("STORED_FILE_NAME");
String originalFileName = (String) resultMap.get("ORG_FILE_NAME");
//파일을 저장했던 위치에서 첨부파일을 읽어 byte[]형식으로 변환한다.
byte fileByte[] = org.apache.commons.io.FileUtils.readFileToByteArray(new File("C:\\mp\\file\\"+storedFileName));
response.setContentType("application/octet-stream");
response.setContentLength(fileByte.length);
response.setHeader("Content-Disposition", "attachment; fileName=\""+URLEncoder.encode(originalFileName, "UTF-8")+"\";");
response.getOutputStream().write(fileByte);
response.getOutputStream().flush();
response.getOutputStream().close();
/*
다운로드를 만드시고 난 후에 개발자모드 (F12)를 누르고 Network로 가신 후 파일을 다운로드 클릭하면 fileDown이 나옵니다.
Headers쪽에 빨간 박스를 보시면 저희가 response에 set한 값들이 보여지는게 보입니다. 이런식으로 속성들에 어떤 값들이
들어갔는지 확인할 수 있습니다 flush() 메소드는 데이터를 비워주는? 역할을 하고 close() 닫아주는 역할을 합니다.
*/
}
- detail.jsp
<form name="readForm" action="" role="form" method="post">
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script type="text/javascript">
function fn_fileDown(fileNo) {
var formObj = $("form[name='readForm']");
$("#FILE_NO").attr("value", fileNo);
formObj.attr("action", "./fileDown.ino");
formObj.submit();
}
</script>
3. 파일 삭제 및 업로드, 게시판 수정과 삭제
- update.jsp
- tiles.xml
<definition name="update" extends="mainTemplate">
<put-attribute name="header" value="/WEB-INF/view/template/defaultHeader.jsp" />
<put-attribute name="menu" value="/WEB-INF/view/template/defaultMenu.jsp" />
<put-attribute name="footer" value="/WEB-INF/view/template/defaultFooter.jsp" />
<put-attribute name="content" value="/WEB-INF/view/board/update.jsp" />
</definition>
- BoardController.java
@RequestMapping("/update.ino")
public ModelAndView update(HttpServletRequest request) {
int bno = Integer.parseInt(request.getParameter("bno"));
List<Map<String,Object>> lists = boardService.getFileList(bno);
ModelAndView mav = new ModelAndView();
mav.setViewName("update");
mav.addObject("dto", boardService.getDetail(bno));
mav.addObject("file",lists);
return mav;
}
@RequestMapping("/updatePro.ino")
public ModelAndView updatePro(BoardDTO dto,MultipartHttpServletRequest mpRequest) throws Exception {
ModelAndView mav = new ModelAndView();
boardService.updatePro(dto);
if(boardService.getFileList(dto.getBno()).isEmpty()) {
Map<String, Object> map = fileUtil.parseInsertFileInfo(dto, mpRequest);
System.out.println(map);
boardService.insertFile(map);
}
mav.setViewName("redirect:/detail.ino?bno=" + dto.getBno());
/*
List<Map<String,Object>> lists = boardService.getFileList(dto.getBno());
Map<String,Object> map = lists.get(0);
String STORED_FILE_NAME = (String)map.get("STORED_FILE_NAME");
if(STORED_FILE_NAME==null) {//파일 삭제 했을 때
if(mpRequest.getFileNames() != null) {//파일 삭제 후 업로드O
Map<String, Object> map2 = fileUtil.parseInsertFileInfo(dto, mpRequest);
System.out.println(map2);
boardService.insertFile(map2);
mav.setViewName("redirect:/detail.ino?bno=" + dto.getBno());
}
//파일 삭제 후 업로드X
mav.setViewName("redirect:/detail.ino?bno=" + dto.getBno());
}else if (STORED_FILE_NAME!=null) {//파일 삭제 안했을 때
mav.setViewName("redirect:/detail.ino?bno=" + dto.getBno());
}
*/
return mav;
}
@RequestMapping("/deleteFile.ino")
public ModelAndView deleteFile(HttpServletRequest request) {
int bno = Integer.parseInt(request.getParameter("bno"));
List<Map<String,Object>> lists = boardService.getFileList(bno);
Map<String,Object> map = lists.get(0);
fileUtil.parseDeleteFileInfo((String)map.get("STORED_FILE_NAME"));
boardService.deleteFile(bno);
ModelAndView mav = new ModelAndView();
mav.setViewName("redirect:/update.ino?bno=" + bno);
return mav;
}
@RequestMapping("/delete.ino")
public ModelAndView delete(HttpServletRequest request) {
int bno = Integer.parseInt(request.getParameter("bno"));
boardService.delete(bno);
ModelAndView mav = new ModelAndView();
mav.setViewName("redirect:/list.ino");
return mav;
}
- boardMapper.xml
<update id="update" parameterType="ino.web.freeBoard.dto.BoardDTO">
update MP_BOARD set title = #{title},content = #{content} where bno = #{bno}
</update>
<delete id="deleteFile" parameterType="int">
delete MP_FILE where bno = #{bno}
</delete>
<delete id="delete" parameterType="int">
delete MP_BOARD where bno = #{bno}
</delete>
- BoardService
/**
*
* @param dto
*/
public void updatePro(BoardDTO dto) {
sqlSessionTemplate.update("boardMapper.update", dto);
}
public void deleteFile(int bno) {
sqlSessionTemplate.delete("boardMapper.deleteFile", bno);
}
public void delete(int bno) {
sqlSessionTemplate.delete("boardMapper.delete", bno);
}
- update.jsp
<div>
<h1>자료실</h1>
</div>
<div style="width:650px;" align="right">
<a href="./list.ino">리스트로</a>
</div>
<hr style="width: 600px">
<form action="./updatePro.ino" method="post" name="myForm" enctype="multipart/form-data">
<div style="width: 150px; float: left;">이름 :</div>
<div style="width: 500px; float: left;" align="left"><input type="text" name="writer" value="${dto.writer }" readonly/></div>
<div style="width: 150px; float: left;">제목 :</div>
<div style="width: 500px; float: left;" align="left"><input type="text" name="title" value="${dto.title }"/></div>
<div style="width: 150px; float: left;">내용 :</div>
<div style="width: 500px; float: left;" align="left"><textarea name="content" rows="25" cols="65" >${dto.content }</textarea></div>
<input type="hidden" name="bno" value="${dto.bno }"/>
<input type="hidden" name="regdate" value="${dto.regdate }"/>
<div style="width: 150px; float: left;">파일 :</div>
<c:if test="${not empty file }">
<div style="float: left;">
<c:forEach var="file" items="${file }">
${file.ORG_FILE_NAME} <input type="button" value="삭제" onclick="fileRemove();">
</c:forEach>
</div>
</c:if>
<c:if test="${empty file }">
<div style="float: left;">
<input type="file" name="file">
</div>
</c:if>
<div align="right">
<input type="submit" value="수정">
<input type="button" value="삭제" onclick="remove();">
<input type="button" value="취소" onclick="location.href='./list.ino'">
</div>
</form>
- FileUtil.java
//파일 삭제
public void parseDeleteFileInfo (String storedFileName) {
File file = new File(filePath + storedFileName);
if(file.exists()) {
file.delete();
}
}
★ 현업에서 주석 활용을 잘 하자
/**엔터
'교육 정리 > 입사교육' 카테고리의 다른 글
boardAjax 만들기 2 (로그인 구현, 경로수정) (0) | 2021.08.10 |
---|---|
mavenBoard 만들기 6 (오류 수정), boardAjax 만들기(환경 설정,회원가입 구현) (0) | 2021.08.09 |
mavenBoard 만들기 3,4 (페이징 재도전3, 파일 게시판 만들기) (0) | 2021.08.05 |
mavenBoard 만들기 2 (수정, 삭제 구현, 페이징 재도전2) (0) | 2021.08.04 |
mavenBoard 만들기 (0) | 2021.08.03 |
댓글