본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Spring framework

전자정부 프레임워크(Spring) 파일 다운로드

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2019. 4. 29.

 

 

스프링에서 파일 다운로드 요청이 들어오면 응답하는 방법은 여러가지이다. 
그중 FileSystemResource 클래스를 활용한 방법과, 예전스타일의 stream으로 응답하는 방법 2가지가 존재 한다.
그런데, 전자정부 프레임워크 버전에 따라서 FileSystemResource으로 response를 하더라도 '파일을 찾을 수 없습니다' 라는 황당한 오류를 보게 되는 경우가 있다.
정확히 기억나지는 않지만 전자정부 2이하 버전 또는 비슷한 버전에서 간혹 생기기도한다..
물론 다른 설정을 잘못한 버그일 수도 있겠지만..
황당한건...오류 메시지나 버그 메시지가 나오지 않아서 디버깅 하기 어려운 경우도 있으니 말이다.

먼저 첫번째 방법은 FileSystemResource으로 들어온 요청에 대해서 파일을 전해주는 방식이다.

	@RequestMapping(value = "요청주소.do") 
	@ResponseBody  //body만 응답
	public FileSystemResource fileDownload(@RequestParam  HashMap<Object, Object> param, HttpServletResponse response){
		File file = new File("저장된파일주소");
		response.setContentType("응답헤더 타입");  //예 "application/txt"
		response.setHeader("Content-Disposition", "attachment; filename=사용자가받을 파일이름");		
		return new FileSystemResource(file);
	}

위 형식처럼 사용 한다면 정말 코드가 깔끔하고, 어렵지 않게 구현 가능하다.
그런데..
앞서 말한 것 처럼 무언가(?)에의해 파일다운로드 기능이 잘 되지 않는다면 예전부터 쓰이던 stream으로 응답하는 방식을 사용하는 것을 추천한다..
괜히 안되는거 붙잡고 있어봤자..스트레스만 받으니..

@RequestMapping(value = "/요청주소.do")
	public void fileDownload(@RequestParam  HashMap<Object, Object> param,HttpServletResponse response){
		final String filePathAndName = "파일주소";
		response.setContentType("컨텐트 타입");
		response.setHeader("Content-Disposition", "attachment; filename=파일명칭");
		final File fileToDownload = new File(filePathAndName);
		InputStream inputStream = null;  //스트림 객체를
		try {
			inputStream = new FileInputStream(fileToDownload); //파일에서 넣어주고
			IOUtils.copy(inputStream, response.getOutputStream());
			response.flushBuffer();  //응답해준다.
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				inputStream.close();  //닫아준다.
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

기능 및 속도상 두 코드 모두 전부 크게 차이는 없다.
단지 몇줄 더 쓰냐, 안쓰냐의 차이인데..
조금 더 사용자의 직관에 의해서 stream관리를 해주고 싶다면 2번째 코드를,
간단하고 간결한 코드를 사용하고 싶다면 1번째 코드가 나은 것 같다.

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글