태그 보관물: viewresolver

스프링 Single File Download Resolver

웹 프로젝트 개발을 하다보면 업로드한 파일을 다운로드하는 모듈을 요청 받을 때가 있다.
해당되는 파일을 컨트롤러에서 바로 구현을 해도 되겠지만, 스프링 ViewResolver로 구현을 하면 같은 프로젝트의 모든 개발들이 쉽게 사용할 수 있다.

스프링 ViewResolver는 AbstractView를 상속받아서 구현 할 수 있다.

FileDownViewResolver

@Component("fileDownLoadView")
public class FileDownView extends AbstractView{
  private FileInputStream fin = null;
  private BufferedInputStream bis = null;
  private ServletOutputStream sout = null;
  private BufferedOutputStream bos = null;

  @Override
  protected void renderMergedOutputModel(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception {
    // 다운로드 받을 때 저장할 파일명
    String fileName = (String) model.get("fileName");
    // 다운로드 받을 파일경로
    String filePath = (String) model.get("filePath");

    response.setContentType("application/octet-stream;");
    File file = new File(filePath);
    try{
      if(file.exists()){
        response.setHeader("Content-Disposition", "attachment; filename=" + new String(fileName.getBytes("UTF-8"),"ISO8859_1") + ";");

        byte buff[] = new byte[2048];
        int bytesRead;

        fin = new FileInputStream(file);
        bis = new BufferedInputStream(fin);
        sout = response.getOutputStream();
        bos = new BufferedOutputStream(sout);

        while((bytesRead = bis.read(buff)) != -1){
          bos.write(buff, 0, bytesRead);
	}

	bos.flush();

	fin.close();
	sout.close();
	bis.close();
	bos.close();
      }else{
        // 자체 예외발생
       	throw new Exception("해당 파일이 존재하지 않습니다.");
      }
    }catch(CSFWException e){
      throw e;
    }catch(Exception e){
      // 자체 예외발생
      throw new CSFWException("파일 다운로드중에 오류가 발생하였습니다.");
    }finally{
      if(fin != null){fin.close();}
      if(sout != null){sout.close();}
      if(bis != null){bis.close();}
      if(bos != null){bos.close();}
    }
  }
}

스프링에서 ViewResolver로 사용하기 위해서는 xml을 통해서 등록을 해야 하지만, @Component 어노테이션을 사용한다면 별도의 설정없이 바로 사용할 수 있다.

컨트롤러에서 사용하는 방법

@RequestMapping("fileDownload.do")
public String fileDonwLoadSample(ModelMap model) throws Exception{
  model.put("fileName", "저장할 파일명");
  model.put("filePath", "다운로드 할 파일의 풀 경로");
  return "fileDownLoadView";
}