본문 바로가기

SpringFramework/게시판

첨부파일 다운로드.

  1. xml 파일 설정(order값 추가, BeanNameViewResolver추가)
  2. 아래 다운로드 로직 추가
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
    <property name="order" value="0"/>
</bean>
자바 스프링에서 파일을 다운로드 하는 예제를 올려보겠습니다. 저는 각종 문서 템플릿을 사용자들이 다운받을 수 있도록 JSP페이지에 기능을 추가 하였습니다. 파일 다운로드 로직을 유틸자바파일로 생성하고, 컨트롤러단에서 사용하였습니다. JSP 에서 url로 호출하여 사용하였습니다. 순서대로 진행하시면, 자연스럽게 이해되실꺼에요. 
  1. 자바파일다운로드 코딩로직 (DownloadView.java 파일을 생성해준다.)

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.util.FileCopyUtils;

public class DownloadView {
public void filDown(HttpServletRequest request,
HttpServletResponse response, String filePath, String realFilNm,
String viewFileNm) throws IOException {

    File file = new File( filePath + realFilNm);
    System.out.println("root = " + filePath + realFilNm);
    if (file.exists() && file.isFile()) {
        response.setContentType("application/octet-stream; charset=utf-8");
        response.setContentLength((int) file.length());
        String browser = getBrowser(request);
        String disposition = getDisposition(viewFileNm, browser);
        response.setHeader("Content-Disposition", disposition);
        response.setHeader("Content-Transfer-Encoding", "binary");
        OutputStream out = response.getOutputStream();
        FileInputStream fis = null;
        fis = new FileInputStream(file);
        FileCopyUtils.copy(fis, out);
        if (fis != null)
            fis.close();
        out.flush();
        out.close();
    }
}

private String getBrowser(HttpServletRequest request) {
    String header = request.getHeader("User-Agent");
    if (header.indexOf("MSIE") > -1 || header.indexOf("Trident") > -1)
        return "MSIE";
    else if (header.indexOf("Chrome") > -1)
        return "Chrome";
    else if (header.indexOf("Opera") > -1)
        return "Opera";
    return "Firefox";
}

private String getDisposition(String filename, String browser)
        throws UnsupportedEncodingException {
    String dispositionPrefix = "attachment;filename=";
    String encodedFilename = null;
    if (browser.equals("MSIE")) {
        encodedFilename = URLEncoder.encode(filename, "UTF-8").replaceAll(
                "\\+", "%20");
    } else if (browser.equals("Firefox")) {
        encodedFilename = "\""
                + new String(filename.getBytes("UTF-8"), "8859_1") + "\"";
    } else if (browser.equals("Opera")) {
        encodedFilename = "\""
                + new String(filename.getBytes("UTF-8"), "8859_1") + "\"";
    } else if (browser.equals("Chrome")) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < filename.length(); i++) {
            char c = filename.charAt(i);
            if (c > '~') {
                sb.append(URLEncoder.encode("" + c, "UTF-8"));
            } else {
                sb.append(c);
            }
        }
        encodedFilename = sb.toString();
    }
    return dispositionPrefix + encodedFilename;
}

}

  1. 컨트롤러단에서 객체를 생성하고 호출한다. (여기는 컨트롤러에서 서블릿 하나를 추가해줍니다.)
// 문서템플릿 파일 다운로드
@RequestMapping(value = "/document/fileDownload.do")
public  void fileDownload(
          @RequestParam("document_nm") String document_nm
        , HttpSession session
        , HttpServletRequest req
        , HttpServletResponse res
        , ModelAndView mav) throws Throwable 
{
    try {
        DownloadView fileDown = new DownloadView(); //파일다운로드 객체생성
        fileDown.filDown(req, res, "파일경로입력" + "/" , "파일이름이력", "다운받았을때출력되는파일이름입력"); //파일다운로드 


    } catch (Exception e) {
        e.printStackTrace();
        logger.error(e.toString());
    }
}

위에 한글로 표기해 논거처럼 객체를 생성한 후에, 알맞게 입력해줍니다. 파일경로입력 과 파일이름입력 은 사용자들에게 서버에서 다운시켜주고 싶은 파일경로와 파일명을 입력하면 됩니다. 마지막 다운받았을때출력되는파일이름은 말 그대로 사용자들이 다운했을때, 보여지는 파일명 입니다.

  1. JSP 파일에서 RequestMapping 으로 값을 준 url로 컨트롤러 서블릿(위에2번)을 호출한다.

    //문서다운로드
    function fn_downfile(document_nm){
    location.href="/document/fileDownload.do?document_nm=" + document_nm);
    }
    위와 같이 JSP파일에서 스크립트로 추가 해준 다음에, 버튼을 하나 생성하여 fn_downfile()을 호출하시면 됩니다.

document_nm 은 변수에요. 스크립트가 호출되면서 저 문서에 맞는 파라미터값을 서블릿에서 처리하며, 원하는 파일이 다운로드 되겠죠?

출처:https://happy-hs.tistory.com/23

'SpringFramework > 게시판' 카테고리의 다른 글

게시판 간단한 페이징 기능  (0) 2018.09.27