고래씌

[Spring] 8-4. 첨부파일 사진 다운로드 본문

Server/Spring

[Spring] 8-4. 첨부파일 사진 다운로드

고래씌 2024. 1. 25. 16:39

1. 사진 다운로드 추가

 

▶ boardDetailView.jsp

 

=> 빨간 밑줄 코드 추가

 

▶ BoardController.java

 

=> ResourceLoader 의존성 주입을 위해서 추가

 

	// 사진 다운로드
	@GetMapping("/fileDownload/{boardNo}")
	public ResponseEntity<Resource> fileDownload(@PathVariable("boardNo") int boardNo) {
		
		ResponseEntity<Resource> responseEntity = null;
		// db에서 board테이블에서 boardNo값과 일치하는 행의 파일정보 조회
		
		BoardExt b = boardService.selectBoard(boardNo);
		
		if(b.getOriginName() == null) {
			return responseEntity.notFound().build(); // 응답상태 404로 설정후 반환
		}
		
		// Resource객체로 파일 얻어오기
		String saveDirectory = application.getRealPath("/resources/images/board/" + b.getBoardCd() + "/");
		
		// 디렉토리 경로(saveDirectory)상에서 두번째 매개변수로 전달받은 파일을 찾아서 객체 생성
		File downFile = new File(saveDirectory, b.getChangeName());
		
		Resource resource = resourceLoader.getResource("file:"+downFile);
		
		try {
			String filename = new String(b.getOriginName().getBytes("utf-8"), "iso-8859-1");
			// utf-8 방식으로 인코딩된 데이터(문자열)을 iso-8859-1로 변환 → http통신할 때 인코딩방식을 iso-8859-1로 해야하기 때문
			
			responseEntity = ResponseEntity.ok()
					// 내가 넘겨주고자하는 데이터가 바이너리형식의 데이터임을 의미
							 .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE)
							 // CONTENT_DISPOSITION : 파일을 첨부파일 형태로 처리하겠다는 의미(다운로드)
							 .header(HttpHeaders.CONTENT_DISPOSITION , "attachment;filename="+filename)
							 .body(resource);
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
		return responseEntity;
	}

 

 

 

=> 우리는 boardMapper에서 id가 selectBoard를 가져오기 때문에 BoardDaoImpl.java에서 버전2를 주석처리하고 다시 버전1로 실행함

▶ BoardDaoImpl.java

//	일반 게시글 상세보기
	@Override
	public BoardExt selectBoard(int boardNo) {
		// 버전1) 쿼리문 한번실행
		return sqlSession.selectOne("boardMapper.selectBoard", boardNo);
		
		// 버전2) 쿼리문 두번실행
//		return sqlSession.selectOne("boardMapper.selectBoardOnly", boardNo);
	}

 

 

 

▶ 결과

 

=> 다운로드 클릭하면 정상적으로 다운로드가 실행되는 것을 알 수 있다!