SPRING/IceWater Community

[스프링]게시판 첨부파일 다운로드 (3)

간펴니 2021. 8. 30. 11:41
728x90

mapper 작성

<select id="selectFileInfo" parameterType="hashMap" resultType="hashMap">
	SELECT 
		STORED_FILE_NAME,
		ORG_FILE_NAME
	FROM MP_FILE
	WHERE FILE_NO = #{FILE_NO}
</select>

파일번호를 기준으로 파일테이블의 파일이름을 검색합니다.

 


 

function fn_fileDown(fileNo){
			var formObj = $("form[name='readForm']");
			$("#FILE_NO").attr("value", fileNo);
			formObj.attr("action", "/board/fileDown");
			formObj.submit();
		}

다운로드를 요청하는 게시글 상세페이지 뷰의 script 태그 사이에 해당 함수를 넣어준다.

전 포스팅에서 만들어놓은 onclick 함수와 input hidden태그를 사용해서,

다운로드를 실행하면 readForm(상세페이지 폼)의 fileNo를 (value라는 이름의 key , {파일번호}) 라는 Map<Stirng,Object> 의 형태의 파라미터를 컨트롤러로 보냄

 


 

DAO 작성

BoardDAO

	public Map<String, Object> selectFileInfo(Map<String, Object> map) throws Exception;
    

BoardDAOImpl

	@Override
	public Map<String, Object> selectFileInfo(Map<String, Object> map) throws Exception {
		// TODO Auto-generated method stub
		return sqlSession.selectOne("boardMapper.selectFileInfo", map);
	}

뷰에서 받은 map값을 파라미터로 선언하고 , 매개변수로 mapper에 넣어준다.

 


 

BoardService

	public Map<String, Object> selectFileInfo(Map<String, Object> map) throws Exception;
    
    
BoardServiceImpl
	
	@Override
	public Map<String, Object> selectFileInfo(Map<String, Object> map) throws Exception {
	
		return dao.selectFileInfo(map);
	}

서비스부분

 


컨트롤러 부분이다.

@RequestMapping(value="/fileDown")
	public void fileDown(@RequestParam Map<String, Object> map, HttpServletResponse response) throws Exception{
		Map<String, Object> resultMap = service.selectFileInfo(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();
		
	}

map값을 파라미터로 받아오고, mapper의 selectFileInfo에서 FileNo(파일PR) 저장된이름과 원본파일이름을 get으로 가져온다.

 

파일을 저장했던 위치(저장위치+저장이름) 에서 파일을 읽어서 byte[]형식으로 변환하고

 

contentType과 응답코드,응답 메시지등을 담아서 전송하는 HttpServletResponse를 이용해서 값을 넘긴다.

URLEncoder는 여러가지 문자(인코딩타입)로 됐을 수 있는 원본파일이름을 UTF-8로 인코딩해주는 역할이다.

쿠키나 리다이렉트와 같이 Response를 사용하는 부분에서도 사용할 수 있겠다.

 

 

 

728x90