3층 1구역 - 개발의 장/Spring

spring - 회원제 게시판 구현하기 - 게시판(4) [다운로드] (2022-11-07)

상이태상 2022. 11. 7. 23:37

1. 서론

이제 게시물 내용에서 첨부파일을 받아보도록 하자.

 

2. 본론

미리 말하지만 만약에 코드가 이상 없는데 해당 내용이 나오지 않는다? 라고 생각되면 서버를 재시작해보거나

해당 코드를 다시 작성해보길 바란다. 서버가 해당 내용을 인식하는데 시간이 걸리는 건지 원인은 모르겠지만

이러면 해결되는 경우가 있다.

 

viewForm.jsp(전체)

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:url var="root" value="/" />

<center>
<table style="width: 650px; ">
	<tr>
		<td style="width: 300px; height:40px;" valign="middle"><h2>${board.title }</h2></td>
		<td style="width: 350px; height:40px;" align="right" valign="bottom">${board.writeDate }</td>
	</tr>
	<tr>
		<td colspan=2><hr/></td>
	</tr>
	<tr>
		<td  style="width: 300px; height:40px;" valign="top">${board.id }</td>
		<td style="width: 350px; height:40px;" align="right" valign="top">
			<c:if test="${board.fileName != '파일 없음' }">
				<a href="${root }download?file=${board.fileName }">${board.fileName }</a>
			</c:if>
		</td>
	</tr>
	<tr>
		<td colspan=2 style="width: 650px; height: 300px" valign="top">
		<pre>${board.content }</pre>
		</td>
	</tr>
	<tr>
		<td colspan=2><hr/></td>
	</tr>
	<tr>
		<td colspan=2 align="right">
			<input type=button style="width: 60px; " value='글쓰기' onclick="location.href='${root}index?formpath=write'"/> 
			<input type=button style="width: 60px; " value='수정'/>
			<input type=button style="width: 60px; " value='삭제'/>
			<input type=button style="width: 60px; " value='목록' onclick="location.href='${root}boardProc'"/>
		</td>
	</tr>
</table>
</center>

 

viewForm.jsp(적용된 코드)

<td style="width: 350px; height:40px;" align="right" valign="top">
			<c:if test="${board.fileName != '파일 없음' }">
				<a href="${root }download?file=${board.fileName }">${board.fileName }</a>
			</c:if>
		</td>

여기서 Controller로 넘어갈 value값은 2개이다.

download, file이다.

 

BoardController.java(전체)

package com.care.pra.board.controller;

import java.io.File;
import java.io.FileInputStream;

import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import com.care.pra.board.service.IBoardService;

@Controller
public class BoardController {
	
	//console창에 해당 로그가 찍힌다. 따라서 프로그램의 오류 발생 시 어디서 어떤 이유로 오류가 발생했는지
	//알 수 있어 이슈처리가 용이하다.
	final static Logger logger = LoggerFactory.getLogger(BoardController.class);
	
	@Autowired IBoardService service;
	
	@RequestMapping(value = "writeProc")
	public String writeProc(MultipartHttpServletRequest multi) {
		service.writeProc(multi);
		return "forward:boardProc";
	}
	
	@RequestMapping(value = "boardProc")
	public String boardProc(Model model) {
		service.boardProc(model, 0, null, null);
		return "forward:/index?formpath=board";
	}
	
	//제이쿼리를 통해 viewProc값을 받게 된다.
	@RequestMapping(value = "viewProc")
	public String viewProc(@RequestParam(value = "writeNo", required = false) String writeNo, Model model) {
		
		//만약 게시물 번호가 없거나 비어있다면
		if(writeNo == null || writeNo == "")
			return "forward:/index?formpath=board";
		
		//넘겨받은 게시물의 번호를 정수 자료형으로 변환한다.
		int no = Integer.parseInt(writeNo);
		service.viewProc(no, model);
		
		service.upHit(no);
		return "forward:/index?formpath=view";

	}
	
	@RequestMapping(value = "download")
	public void download(@RequestParam(value = "file") String fileName, HttpServletResponse res) throws Exception {
		if(fileName == "" || "파일 없음".equals(fileName))
			return;
		
		res.addHeader("Content-disposition", "attachment; filename="+fileName);
		File file = new File(IBoardService.FILE_LOCATION + "\\" + fileName);
		FileInputStream input = new FileInputStream(file);
		FileCopyUtils.copy(input, res.getOutputStream());
		input.close();
	}
}

 

BoardController.java(추가된 코드)

@RequestMapping(value = "download")
	public void download(@RequestParam(value = "file") String fileName, HttpServletResponse res) throws Exception {
		if(fileName == "" || "파일 없음".equals(fileName))
			return;
		
		res.addHeader("Content-disposition", "attachment; filename="+fileName);
		File file = new File(IBoardService.FILE_LOCATION + "\\" + fileName);
		FileInputStream input = new FileInputStream(file);
		FileCopyUtils.copy(input, res.getOutputStream());
		input.close();
	}

 

결과를 보도록 하자.

 

이제 첨부파일이 잘 나오고?

 

잘 다운로드도 받아진다.

 

파일이 없다면 해당 위치에 아무것도 표시되지 않는다.

 

3. 결론