[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페이지에 대한 정보(다운로드)를 저장하는 기능을 해줌
저 두 줄의 코드를 작성하면 페이지의 정보를 보내는 부분을 초기화 하는 작업을 한다고 생각할 수 있음
728x90
'프론트엔드 > JSP' 카테고리의 다른 글
[JSP] include 사용방법 (0) | 2020.12.16 |
---|---|
[JSP] JSP로 서버에 올라가 있는 PDF파일 바로 열기 (0) | 2020.11.29 |
[JSP] JSP 스크립틀릿 태그 내에 경로 작성시 에러 (0) | 2020.11.29 |