[JSP] JSP페이지에서 다운로드 구현시 Exception 발생

2020. 11. 29. 00:54프론트엔드/JSP

728x90

[문제상황]

아래코드와 같이 PDF파일을 JSP에서 바로 열도록 구현시 파일을 여는데는 문제가 없었지만 'java.lang.IllegalStateException' 발생

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page language="java" trimDirectiveWhitespaces="true"%>    
<%@ page import="java.io.FileInputStream" %>   
<%@ page import="java.io.BufferedOutputStream" %> 
<%@ page import="java.io.File" %> 
<%@ page import="java.io.IOException" %>         
 <%
 
FileInputStream fis = null;
BufferedOutputStream bos = null;

try{
	
    String fileName = "서버경로\\aaa.pdf";
    File file = new File(fileName);
    
    // 보여주기
    response.setContentType("application/pdf");
    response.setHeader("Content-Description", "JSP Generated Data");
    // 다운로드
    //response.addHeader("Content-Disposition", "attachment; filename = " + file.getName() + ".pdf");
 
    fis = new FileInputStream(file);
    int size = fis.available();
    
    byte[] buf = new byte[size];
    int readCount = fis.read(buf);
 
    response.flushBuffer();
 
    bos = new BufferedOutputStream(response.getOutputStream());
    bos.write(buf, 0, readCount);
    bos.flush();
} catch(Exception e) {
    response.setContentType("text/html;charset=euc-kr");
    out.println("<script language='javascript'>");
    out.println("alert('파일 오픈 중 오류가 발생하였습니다.');");
    out.println("</script>");
    e.printStackTrace();
} finally{
    try{
        if(fis != null) fis.close();
        if(bos != null) bos.close();
    } catch(IOException e){
        e.printStackTrace();
    }    
}
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

 

 

 

[해결방법]

결론적으로 초기화 코드 두 줄을 추가해주니 해결됨

out.clear();
out = pageContext.pushBody();
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@page language="java" trimDirectiveWhitespaces="true"%>    
<%@ page import="java.io.FileInputStream" %>   
<%@ page import="java.io.BufferedOutputStream" %> 
<%@ page import="java.io.File" %> 
<%@ page import="java.io.IOException" %>         
 <%
 
FileInputStream fis = null;
BufferedOutputStream bos = null;

//아래 두줄의 초기화 코드를 넣지 않으면 'java.lang.IllegalStateException' 발생 
out.clear();
out = pageContext.pushBody();
try{
	
    String fileName = 서버경로\\aaa.pdf";
    File file = new File(fileName);
    
    // 보여주기
    response.setContentType("application/pdf");
    response.setHeader("Content-Description", "JSP Generated Data");
    // 다운로드
    //response.addHeader("Content-Disposition", "attachment; filename = " + file.getName() + ".pdf");
 
    fis = new FileInputStream(file);
    int size = fis.available();
    
    byte[] buf = new byte[size];
    int readCount = fis.read(buf);
 
    response.flushBuffer();
 
    bos = new BufferedOutputStream(response.getOutputStream());
    bos.write(buf, 0, readCount);
    bos.flush();
} catch(Exception e) {
    response.setContentType("text/html;charset=euc-kr");
    out.println("<script language='javascript'>");
    out.println("alert('파일 오픈 중 오류가 발생하였습니다.');");
    out.println("</script>");
    e.printStackTrace();
} finally{
    try{
        if(fis != null) fis.close();
        if(bos != null) bos.close();
    } catch(IOException e){
        e.printStackTrace();
    }    
}
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

 

 

[설명]

JSP에서 다른 JSP에 있는 페이지를 호출해서 다운로드 로직을 실행하는 경우 이미 스크립이 열려 있는 상태인데 추가적으로 스트림을 열려고 하면 이미 열려있는 스트림을 또 열려고 하는 것이기 떄문에 에러메시지를 생성함

따라서 사용하기 전에 스트림을 한 번 비우고 깔끔하게 전송을 해야함

' out.clear(); 호출시 스트림을 깔끔하게 비우게 해줌

' out = pageContext.pushBody(); '  호출시 JSP페이지에 대한 정보(다운로드)를 저장하는 기능을 해줌

저 두 줄의 코드를 작성하면 페이지의 정보를 보내는 부분을 초기화 하는 작업을 한다고 생각할 수 있음

 

 

 

참고 : hotwolf.tistory.com/5

728x90