티스토리 뷰

카테고리 없음

[Java] 파일 다운로드 예제

무중력인간 2021. 12. 24. 05:03
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DownloadFile {

    /**
     * 파일 다운로드
     * 
     * @param filePath: 파일명.ext을 포함한 전체 경로
     * @param fileName: 파일명.ext
     * @param request
     * @param response
     * @throws Exception
     */
    public static void fileDownload(String filePath, String fileName, HttpServletRequest request, HttpServletResponse response) throws Exception {
        response.reset();

        // IE 체크
        if (request.getHeader("User-Agent").indexOf("MSIE5.0") > -1) {
            // IE 아닐 경우
            response.setHeader("Content-Type", "doesn/matter;");
        } else {
            // IE 일경우
            response.setHeader("Content-Type", "application/unknown");
        }

        setDisposition(fileName, request, response);

        // *** 파일 다운로드
        File fp = new File(filePath);

        int read = 0;
        byte[] b = new byte[(int) fp.length()]; // 파일 크기

        if (fp.isFile()) {
            BufferedInputStream fin = new BufferedInputStream(new FileInputStream(fp));
            BufferedOutputStream outs = new BufferedOutputStream(response.getOutputStream());

            // 파일 읽어서 브라우저로 출력하기
            try {
                while ((read = fin.read(b)) != -1) {
                    outs.write(b, 0, read);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (outs != null) {ㅣ
                    outs.close();
                }
                if (fin != null) {
                    fin.close();
                }
            }
        }
    }

    /**
     * 헤더의 Content-Disposition 지정
     * 
     * @param filename
     * @param request
     * @param response
     * @throws Exception
     */
    private static void setDisposition(String filename, HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        String browser = getBrowser(request);

        String dispositionPrefix = "attachment; filename=";
        String encodedFilename = null;

        if (browser.equals("MSIE")) {
            encodedFilename = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", "%20");
        } else if (browser.equals("Trident")) { // IE11 문자열 깨짐 방지
            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();
        } else {
            throw new IOException("Not supported browser");
        }

        response.setHeader("Content-Disposition", dispositionPrefix + encodedFilename);
        response.setHeader("Content-Transfer-Encoding", "binary;");

        if ("Opera".equals(browser)) {
            response.setContentType("application/octet-stream;charset=UTF-8");
        }
    }

    /**
     * 브라우저 구분값 반환
     * 
     * @param request
     * @return
     */
    public static String getBrowser(HttpServletRequest request) {
        String agent = request.getHeader("User-Agent");

        if (agent.indexOf("MSIE") > -1) {
            return "MSIE";
        } else if (agent.indexOf("Trident") > -1) {
            return "Trident";
        } else if (agent.indexOf("Chrome") > -1) {
            return "Chrome";
        } else if (agent.indexOf("Opera") > -1) {
            return "Opera";
        }

        return "Firefox";
    }

}

 

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함