struts2 result
타입 – stream(파일 다운로드)
오라클자바커뮤니티에서 설립한 오엔제이프로그래밍
실무교육센터
(신입사원채용무료교육, 오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷)
result
type의 하나인 stream은 InputStream에서 데이터를 읽어 그대로
HttpServletResponse에 보낸다. 파일 다운 로드 기능을 구현할 때
적절히 사용하면 되는데 파라미터는 다음과 같은 것들이 있다.
contentType : 브라우저로 보내는 Mime Type(default :
text/plain)
contentLength : Stream의 길이
contentDisposition : 파일이름을 지정. Filename=”다운로드될파일명”으로 기술
bufferSize : 입력을
출력으로 복사할 때의 버퍼 크기
result 작성 예는 아래와 같다.
<result name="success"
type="stream">
<param
name="inputName">inputStream</param>
<param
name="contentDisposition">attachment;
filename=${fileName}</param>
<param
name="bufferSize">10240000</param>
</result>
위 XML에서 contentDisposition
파라미터 값인 attachment를 빼면 파일은 열리지 않고 브라우저에서 보이게 되니
주의해야 한다! (직접 테스트 해보라)
이 때 주의할 점은
HTTP 응답헤더를 바로 result 안에서
설정하게 되는데 만약 이를 action 내 method에서
정의를 하는 경우에는 중복 정의가 되므로 예상치 못한 결과가 나온다.
예제를 작성해
보자.
1. FileDownloadAction.java를 작성한다.
package stream;
import
java.io.FileInputStream;
import
java.io.InputStream;
import
com.opensymphony.xwork2.Action;
public class FileDownloadAction implements Action
{
String dir; //struts.xml에서 넘어오는 값으로 세팅
String fileName; //요청파라미터 이름과 일치할 것
InputStream inputStream; //이 변수명은
struts.xml의
<param name="inputName">으로 정의됨
public String execute() throws Exception
{
inputStream = new FileInputStream(dir + "/" +
fileName);
return SUCCESS;
}
public void setDir(String dir) {
this.dir = dir;
}
public void setFileName(String fileName)
{
this.fileName = fileName;
}
public InputStream getInputStream()
{
return inputStream;
}
public String getFileName() {
return this.fileName;
}
}
2. struts.xml 작성
<?xml version="1.0" encoding="UTF-8"
?>
<!DOCTYPE struts
PUBLIC
"-//Apache
Software Foundation//DTD Struts Configuration
2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package
name="struts2"
extends="struts-default">
<action name="download"
class="stream.FileDownloadAction">
<interceptor-ref
name="exception"/>
<interceptor-ref
name="staticParams"/>
<interceptor-ref name="params"/>
<!—action
에 있는 dir 값 세팅 à
<param
name="dir">c:/oraclejava/download</param>
<result name="success"
type="stream">
<param
name="inputName">inputStream</param>
<!—아래 =${fileName}은 Action에 있는 fileName값을 읽는다
à
<param
name="contentDisposition">attachment;
filename=${fileName}</param>
<param
name="bufferSize">10240000</param>
</result>
<result
name="error">/stream/fileNotFound.jsp</result>
<exception-mapping result="error"
exception="java.io.FileNotFoundException"/>
</action>
</package>
</struts>
3. stram/download.jsp 작성
<%@ page pageEncoding = "EUC-KR"
%>
<a
href="http://localhost:8080/result/stream/download.action?fileName=test.txt">
파일 다운로드(c:\oraclejava\download\test.txt)
</a>
4. stream/fileNotFound.jsp 작성
File Not Found!!
5. 실행(http://localhost:8080/result/stream/download.jsp)
댓글 없음:
댓글 쓰기