/**
 * ÀÌ ¼Ò½º´Â Spring ÇÁ·¹ÀÓ¿öÅ© ¿öÅ©ºÏ¿¡¼­ »ç¿ëÇÑ ¿¹Á¦ ¼Ò½ºÀÔ´Ï´Ù. 
 * ÀÌ ¼Ò½º´Â ¸ðµç °³¹ßÀÚµéÀÌ ÀÚÀ¯·Ó°Ô ¼öÁ¤ ¹× ¹èÆ÷ÇÒ ¼ö ÀÖ½À´Ï´Ù. 
 * ´Ü, ÀÌ ¼Ò½º¸¦ ±â¹ÝÀ¸·Î »õ·Î¿î ¾ÖÇÃ¸®ÄÉÀÌ¼ÇÀ» °³¹ßÇÒ °æ¿ì ÃâÃ³¸¦ ¸í½ÃÇØ ÁÖ½Ã¸é µË´Ï´Ù. 
 */
package net.javajigi.servlet;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.javajigi.board.model.BoardFile;
import net.javajigi.board.service.BoardService;
import net.javajigi.board.service.BoardServiceHelper;
import net.javajigi.common.util.HanUtil;

/**
 * ÁÖ¼®À» ³Ö¾î ÁÖ¼¼¿ä. ¹è°¡ °íÆÄ¿ä.
 * 
 * @author ¹ÚÀç¼º(ÀÚ¹ÙÁö±â, javajigi@gmail.com)
 */
public class DownloadServlet extends HttpServlet {
    protected void performTask(javax.servlet.http.HttpServletRequest request,
            javax.servlet.http.HttpServletResponse response) throws Exception {
        int boardFileNo = Integer.parseInt(request.getParameter("boardFileNo"));

        BoardService boardService = BoardServiceHelper
                .getBoardService(getServletContext());
        BoardFile boardFile = boardService.findBoardFile(boardFileNo);

        try {
            String filePath = "D:\\Temp\\fileupload\\upload\\"
                    + boardFile.getTempFileName();
            File tempFile = new File(filePath);

            String fileName = boardFile.getFileName();
            fileName = fileName.substring(fileName.lastIndexOf("/") + 1);
            fileName = HanUtil.kscToAsc(fileName);

            String agentType = request.getHeader("Accept-Encoding");
            try {
                if (!tempFile.exists() || !tempFile.canRead()) {
                    PrintWriter out = response.getWriter();
                    out
                            .println("<script>alert('File Not Found');history.back();</script>");
                    return;
                }
            } catch (Exception e) {
                PrintWriter out = response.getWriter();
                out
                        .println("<script>alert('File Not Found');history.back();</script>");
                return;
            }

            boolean flag = false;
            if (agentType != null && agentType.indexOf("gzip") >= 0)
                flag = true;

            flag = false;

            if (flag) {
                response.setHeader("Content-Encoding", "gzip");
                response.setHeader("Content-disposition",
                        "attachment;filename=" + fileName);
                javax.servlet.ServletOutputStream servletoutputstream = response
                        .getOutputStream();
                java.util.zip.GZIPOutputStream gzipoutputstream = new java.util.zip.GZIPOutputStream(
                        servletoutputstream);
                dumpFile(tempFile, gzipoutputstream);
                gzipoutputstream.close();
                servletoutputstream.close();
            } else {
                response.setContentType("application/octet-stream");
                response.setHeader("Content-disposition",
                        "attachment;filename=" + fileName);
                javax.servlet.ServletOutputStream servletoutputstream1 = response
                        .getOutputStream();
                dumpFile(tempFile, servletoutputstream1);
                servletoutputstream1.flush();
                servletoutputstream1.close();
            }

        } catch (Exception e) {
            PrintWriter out = response.getWriter();

            out
                    .println("<script>alert('File Not Found');history.back();</script>");
            return;
        }

        return;
    }

    private void dumpFile(File realFile, OutputStream outputstream) {
        byte readByte[] = new byte[4096];
        try {
            BufferedInputStream bufferedinputstream = new BufferedInputStream(
                    new FileInputStream(realFile));
            int i;
            while ((i = bufferedinputstream.read(readByte, 0, 4096)) != -1)
                outputstream.write(readByte, 0, i);
            bufferedinputstream.close();
        } catch (Exception _ex) {
        }
    }

    /**
     * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest,
     *      javax.servlet.http.HttpServletResponse)
     */
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doPost(req, resp);
    }

    /**
     * @see javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest,
     *      javax.servlet.http.HttpServletResponse)
     */
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        try {
            performTask(req, resp);
        } catch (Exception e) {
            throw new ServletException(e.getMessage());
        }
    }

}