2013년 8월 12일 월요일

[오라클자바community, struts, spring강좌]struts2 result–stream(파일다운로드)

struts2 result 타입 – stream(파일 다운로드)


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(신입사원채용무료교육, 오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷)  
 
result type의 하나인 streamInputStream에서 데이터를 읽어 그대로 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!!
 

댓글 없음:

댓글 쓰기