* View 정의

/**
 * 파일 다운로드시 Controller 에서 return 할 목적으로 생성한 view
 * 
 * @author STEVE
 */
@Slf4j
@Component("fileDownloadView")
public class FileDownloadView extends AbstractView {
    
    private FileInputStream fin = null;
    private BufferedInputStream bis = null;
    private ServletOutputStream sout = null;
    private BufferedOutputStream bos = null;

    @SuppressWarnings("rawtypes")
    @Override
    protected void renderMergedOutputModel(Map params, HttpServletRequest request, HttpServletResponse response) throws Exception {
        
        String serverFilePath = (String) params.get("serverFilePath"); // 다운로드 받을 파일경로 (서버 임시저장파일 전체경로)
        String clientFileName = (String) params.get("clientFileName"); // 다운로드 받을 때 저장할 파일명 (클라이언트가 보는)

        response.setContentType("application/octet-stream;");
        File file = new File(serverFilePath);
        
        try {
            if (file.exists()) {
                response.setHeader("Content-Disposition", "attachment; filename=" + new String(clientFileName.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 (Exception e) {
            log.error("", e);

        } finally {
            if (fin != null) {
                fin.close();
            }
            if (sout != null) {
                sout.close();
            }
            if (bis != null) {
                bis.close();
            }
            if (bos != null) {
                bos.close();
            }
        }
    }
}

 

* Controller  method 적용

// 파일 다운로드를 위한 값 설정 (FileDownloadView) 참조
model.addAttribute("serverFilePath", serverFilePath);
model.addAttribute("clientFileName", pdfFileName);
    
// 파일 다운로드
return "fileDownloadView";