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
'SPRING > IceWater Community' 카테고리의 다른 글
[스프링]게시판 글작성 에디터 적용과 파일미리보기,이미지 미리보기 (0) | 2021.08.30 |
---|---|
[스프링] 첨부파일 다중파일 구현, 수정,삭제 로직의 설명(4) (2) | 2021.08.30 |
[스프링] 게시글 첨부파일 조회 구현 설명(select) (2) (1) | 2021.08.30 |
[스프링]게시판 첨부파일 업로드 구현 설명(insert) (1) (1) | 2021.08.30 |
[스프링]-댓글 수 구현 : 동기,비동기 방식을 사용할 때의 구현, 차이점과 2가지의 댓글 수 변경 로직 (0) | 2021.08.26 |