엑셀파일다운로드

 | JSP
2012. 5. 8. 18:14

출처 : http://blog.naver.com/tyboss/70038694288


1. 첫번째 방법

<%
response.setHeader("Content-Disposition", "attachment; filename=diary.xls");
response.setHeader("Content-Description", "JSP Generated Data");
response.setContentType("application/vnd.ms-excel");
%>

 
 

2. 두번째 방법
<%@ page contentType="application/vnd.ms-excel;charset=euc-kr" %>
<%
response.setHeader("Content-Disposition", "attachment; filename=LIST.xls");
response.setHeader("Content-Description", "JSP Generated Data");
%>

 
 

3. 세번째 방법 (한파일에 기본 페이지와 엑셀 다운로드 설정할때)

<%

if(actionKind.equals("Search")){
response.setContentType("text/html; charset=euc-kr");
}else{
response.setHeader("Content-Disposition", "attachment; filename=diary.xls");
response.setHeader("Content-Description", "JSP Generated Data");
response.setContentType("application/vnd.ms-excel");
}
%>

 

4. 네번째 방법 (한글 제목에 브라우저별 처리)

titleName = "한글제목";

titleName = new String(titleName.getBytes("KSC5601"), "8859_1");

if(clientBrowser.indexOf("MSIE 5.5")>-1 || clientBrowser.indexOf("MSIE 6.0") > -1 ){
response.setHeader("Content-Type", "doesn/matter;");
response.setHeader("Content-Disposition", "filename="+titleName+".xls");
}else{
response.setHeader("Content-Type", "application/vnd.ms-excel;charset=EUC-KR");
response.setHeader("Content-Disposition", "attachment; filename="+titleName+".xls");
}

response.setHeader("Content-Transfer-Encoding", "binary;");
response.setHeader("Pragma", "no-cache;");
response.setHeader("Expires", "-1;");

 

 

=========================================================================================================================

=========================================================================================================================

한글깨짐

 

head 에 다음과 같은 처리를 같이 해주면 왠만하면 해결이 된다.

 

<META HTTP-EQUIVE="CONTENT-TYPE" CONTENT="TEXT/HTML; CHARSET=KSC5601">

or
response.reset(); // response 버퍼를 비우고 respose 값을 세로 세팅

=========================================================================================================================

=========================================================================================================================

 

운영서버에서는 한글이 다 깨지는데 개발서버에서는 제대로 나와서 더 해결방법 찾기가 난감했다.

jsp 소스를 운영 거로 업어치고 나서도 여전히 잘만 보이는 개발서버 쪽 엑셀.. 뭐가 문제냐. ㄱ-

DB 상의 데이터까지 운영 쪽으로 맞추니 그제서야 한글이 깨지기 시작했다.

그럼 문제는 데이터라는 소리인데.. 어떻게 봐도 한글이 깨질 건수가 안 보였다.

 

웹 상에 떠도는 한글 깨짐 방지 태그라는

<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">

이 녀석을 써 봐도 여전히 묵묵부답..

 

하지만 해결책은 간단했다.

엑셀 녀석이 데이터를 인코딩 태그로 인식하는 경우가 간혹 생기는데

데이터 타입 앞에 &nbsp;만 입력해주면 끝. 아주 깨끗하게 잘 나온다.

 

<td>&nbsp;<%= crset.getString(1) %></td> ← 이런 식으로

 

 

=========================================================================================================================

=========================================================================================================================

 

 

 

숫자형식 엑셀에서 표현하기

== 사용법 ==

<style type="text/css">

td {mso-number-format:000000;}

</style>

또는

<td align='center' style='mso-number-format:000000'>

 

000000 : 소수도 여섯자리 정수 (반올림)로 표현된다. 여섯자리 앞의 빈칸은 0으로 채워짐

1.23 => 000001, 67.67 => 000068

000.000 : 소수자리 세자리까지 (반올림) 표현된다. 앞 뒤 빈칸은 0으로 채워짐

format은 0.00 인데 숫자가 15.1 인 경우 15.10으로 표현됨

1.5678 => 001.568

\@ : 셀형식을 텍스트형으로 표현

00035.90 인 경우 셀 형식이 숫자형이라면 35.9로 표현되지만 문자형으로 하면 0을 포함하여 보이는 그대로 표현됨

 

 

 

 

그 외 mso-number-format 요소들

mso-number-format:"0"
NO Decimals
mso-number-format:"0\.000"
3 Decimals
mso-number-format:"\#\,\#\#0\.000"
Comma with 3 dec
mso-number-format:"mm\/dd\/yy"
Date7
mso-number-format:"mmmm\ d\,\ yyyy"
Date9
mso-number-format:"m\/d\/yy\ h\:mm\ AM\/PM"
D -T AMPM
mso-number-format:"Short Date"
01/03/1998
mso-number-format:"Medium Date"
01-mar-98
mso-number-format:"d\-mmm\-yyyy"
01-mar-1998
mso-number-format:"Short Time"
5:16
mso-number-format:"Medium Time"
5:16 am
mso-number-format:"Long Time"
5:16:21:00
mso-number-format:"Percent"
Percent - two decimals
mso-number-format:"0%"
Percent - no decimals
mso-number-format:"0\.E+00"
Scientific Notation
mso-number-format:"\@"
Text
mso-number-format:"\#\ ???\/???"
Fractions - up to 3 digits (312/943)
mso-number-format:"\0022£\0022\#\,\#\#0\.00"
£12.76
mso-number-format:"\#\,\#\#0\.00_ \;\[Red\]\-\#\,\#\#0\.00\"
2 decimals, negative numbers in red and signed(1.56 -1.56)

 

 

한 셀 안에서 줄바꿈

<style>

.xl24 {mso-number-format:"\@";}

br {mso-data-placement:same-cell;}

</style>




'JSP' 카테고리의 다른 글

FileUploadRequestWrapper  (0) 2012.05.08
FileUpLoad  (0) 2012.05.08
fileDownload.jsp  (0) 2012.05.08
FileDownLoad  (0) 2012.05.08
cubrid-dbcp설정.  (0) 2012.05.08
Posted by 사라링

fileDownload.jsp

 | JSP
2012. 5. 8. 18:14

경로  root/common/download.jsp 

받는 파라미터 ./ pds 의 pds_no //파라미터 네임 : file_no

  1. <%@page import="kr.or.ddit.pds.vo.PdsBean"%>
    <%@page import="kr.or.ddit.pds.dao.PdsDaoMyBatis"%>
    <%@page import="kr.or.ddit.pds.dao.IPdsDao"%>
    <%@ page language="java" pageEncoding="utf-8"  %>
    <%@ page trimDirectiveWhitespaces="true" %>
    <%@page import="java.io.FileInputStream"%>
    <%@page import="java.io.BufferedOutputStream"%>
    <%@page import="java.io.BufferedInputStream"%>
    <%@page import="java.io.File"%>
    <%
        String file_no = request.getParameter("file_no");
        // bo_id 검증 필요!!   
        if(file_no == null || file_no.compareTo("") == 0 ){
            // throw new Exception("다운로드 에러~~~~");
            response.setHeader("Content-type", "text/html");
    %>   
    <%@page import="java.sql.SQLException"%>

    <script type="text/javascript">
            <!--
                alert("너 누구야... ");
                history.back();
            //-->
            </script>
            <%
                return;
            } // if(!StringUtils.isNumeric(bo_no))

                IPdsDao pdsDao = new PdsDaoMyBatis();
                PdsBean bean = pdsDao.findByPk(Integer.parseInt(file_no));
               
                if(bean.getPds_realpath() == null || "".equals(bean.getPds_realpath())){
               
                    // throw new Exception("파일이 없습니다.~~~~");
                    response.setHeader("Content-type", "text/html");
                    // response.setStatus(404); // 404 = HttpServletResponse.SC_NOT_FOUND;
                    %>
                    <script type="text/javascript">
                    <!--
                        alert("파일이 존재하지 않는 글입니다.");
                        history.back();
                    //-->
                    </script>
                    <%
                        return;
                }
               
                //dao.downCount(Integer.parseInt(bo_no)); // 숙제 구현        
                // 경로, 실제 저장된 파일을 읽는다
                //String upPath = application.getRealPath("/upload");
                String upPath = "c:\\upload";
               
                String fileName = bean.getPds_userfile(); // 사용자가 올렸던 이름
                File file = new File(bean.getPds_realpath());

                byte b[] = new byte[2048];           

                if (file.length() > 0 && file.isFile()) {
                    String strClient = request.getHeader("User-Agent");
                    if (strClient.indexOf("MSIE 5.5") > -1) {
                        response.setHeader("Content-Disposition", "filename="
                                + (new String(fileName.getBytes("euc-kr"), "iso-8859-1")) + ";");
                    } else {
                        response.setHeader("Content-Disposition", "attachment;filename="
                                + (new String(fileName.getBytes("euc-kr"), "iso-8859-1")) + ";");
                    }
                   
                    response.setHeader("Content-type", "application/octet-stream");
                    response.setHeader("Content-Length", "" + file.length());
                    response.setHeader("Content-Description", "Inna Site");
                    BufferedInputStream fin = new BufferedInputStream(new FileInputStream(file));
                    BufferedOutputStream outs = new BufferedOutputStream(response.getOutputStream());
                    int read = 0;
                    try {
                        while ((read = fin.read(b)) != -1) {
                            outs.write(b, 0, read);
                        }
                        // 성공적으로 내보냈으니까. 다운횟수 증가
                        //pdsDao.incrementDownHit(bean.getPds_no());
                        //pdsDao.incrementDownHit(bean.getPds_downhit());
                        pdsDao.incrementDownHit(bean.getPds_no());
                        //pdsDao.incrementDownHit(bean.getPds_no());
                       
                        outs.close();
                        fin.close();                   
                    } catch (Exception e) {
                        System.out.println(e.getMessage());
                    } finally {
                        if (outs != null) outs.close();
                        if (fin != null) fin.close();
                    }
                } else {
                    // response.setStatus(404); // 404 = HttpServletResponse.SC_NOT_FOUND;
                    response.setHeader("Content-type", "text/html");
                    // response.setStatus(404); // 404 = HttpServletResponse.SC_NOT_FOUND;
                    %>
                    <script type="text/javascript">
                    <!--
                        alert("[<%=bean.getPds_userfile()%>]파일이 서버에 존재하지 않습니다.");
                        history.back();
                    //-->
                    </script>
                <%
                    return;
                }
    %>

이 글은 스프링노트에서 작성되었습니다.

'JSP' 카테고리의 다른 글

FileUpLoad  (0) 2012.05.08
엑셀파일다운로드  (0) 2012.05.08
FileDownLoad  (0) 2012.05.08
cubrid-dbcp설정.  (0) 2012.05.08
ERROR&cokie  (0) 2012.05.08
Posted by 사라링

FileDownLoad

 | JSP
2012. 5. 8. 18:13

[ 다운로드 ]


많은 분들이 download.jsp등이나 서블릿을 이용해서 download를 구현을 합니다.
그 이유는 download를 통해서 down을 받게함으로서 직접적인 파일의 경로를
감추어 서버의 파일구조를 감추려는 보안적인 이유도 있을 것이고
또 download.jsp안에서 session에 값을 체크하여 인증절차를 거쳐야
자료를 받을 수 있게 하기 위한 것일 수도 있고

request.getHeader("referer")를 가지고 이전 페이지 url을알아내거나
HTTP Headers Information중 Host를 체크하여 무단적인 링크를 방지하기
위한 이유등 많은 이유로 처리를 하고 있을 것입니다.

저는 download를 구현함에 있어 같은 질문이 자주 올라오는 것 같아서
그런 내용들에 대해서 간단한 답변들을 적어보도록 하겠습니다.

1. 다운로드시 익스플로러 5.5 버전에서만 제대로 안되요.

이것 버전에 따라서 Header를 다르게 설정해줘야 합니다.

================================================================
중략...

  1. if( strClient.indexOf("MSIE 5.5") != -1 ) {
        response.setHeader("Content-Type", "doesn/matter;");
        response.setHeader("Content-Disposition", "filename=" + strFileName + ";");
    } else {
        response.setHeader("Content-Type", "application/octet-stream;");
        response.setHeader("Content-Disposition", "attachment;filename="+strFileName + ";");
    };
    response.setHeader("Content-Transfer-Encoding", "binary;");
    response.setHeader("Content-Length", ""+file.length());
    response.setHeader("Pragma", "no-cache;");
    response.setHeader("Expires", "-1;");

중략..
================================================================
위의 소스와 같이 HTTP Response Headers의 User-Agent를 체크해서

버전이 5.5일경우와 그외 버전일 경우 header를 다르게 설정해줘야

합니다.


2. 파일 다운로드우 이상한 문자가 앞에 추가가 됩니다.(서버에 파일은 문제없음)

이것은 jsp일때 앞부분에 page지시자를 기술할때 다른 내용이 들어가서 그문자가

파일에 추가되어 나타나는 현상입니다. 해결방법은
================================================================
<%@ page language="java" import="java.util.*,java.io.*,java.sql.*,java.text.*"%>
<%
   String file_path = "D:/resin/webapps"+request.getParameter("file_path");
중략..
================================================================
과 같이 Enter를 입력해서 벌어진 부분을
================================================================
<%@ page language="java" import="java.util.*"%><%
   String file_path = "D:/resin/webapps"+request.getParameter("file_path");
중략..
================================================================
과 같이 붙여서 만들어주면 해결할 수 있습니다.


3. 엑셀, 워드, 파워포인트 파일의 다운로드

ppt나 xls확장자같은경우 전 아래와같이 해서 다운로드를 받고 있습니다.
어디서 소스를 봤는지 기억은 잘 안나지만..아래는 jsp화일의 일부분입니다.

String type  = request.getParameter("do");
String fileurl  = request.getParameter("fileurl");
String filepath = request.getParameter("filepath");
String filename = fileurl.substring(filepath.length()+1,fileurl.length());
PrintStream printstream = new PrintStream(response.getOutputStream(), true);
try {
         File file = new File(filepath,filename);
         FileInputStream fin = new FileInputStream(file);
         
         int ifilesize = (int)file.length();
         byte b[] = new byte[ifilesize];
         
         response.setContentLength(ifilesize);
         response.setContentType("application/smnet");
         response.setHeader("Content-Disposition","attachment; filename="+filename+";");
         
         ServletOutputStream oout = response.getOutputStream();
         
         fin.read(b);
         oout.write(b,0,ifilesize);
         oout.close();
         fin.close(); 
} catch(Exception e) {  }


4. 초간단 파일다운로드 소스

간단한 파일 다운로드 프로그램임다..
링크는 download.jsp?db=db이름&table=table이름&num=번호 와 같이 하면 됩니다.

-- download.jsp --

<%@ page contentType="text/html; charset=EUC_KR" %>
<%@ page import="java.io.*, IBboard.beans.file.FileDownload" %>
<%
//응답 헤더의 Content-Type을 세팅한다.
response.setContentType("application/x-msdownload");

FileDownload filedown = new FileDownload();

//DB에서 해당 번호에 해당하는 파일의 이름을 얻어온다.
String filename = filedown.NumToFilename(request.getParameter("db"),request.getParameter("table"),Integer.parseInt(request.getParameter("num")));
//Content-Disposition 헤더에 세팅하기위해 file 이름을 코드 변환한다.
//한글파일 Download 시에 에러가 나는게 이 코드가 빠져 있어서 그런거 같은디..^^
String filename2 = new String(filename.getBytes("euc-kr"),"8859_1");
//Content-Disposition 헤더에 파일 이름 세팅.
response.setHeader("Content-Disposition","attachment; filename="+filename2);
//해당 경로의 파일 객체를 만든다.
File file = new File ("/usr/local/apache/htdocs/upload/"+filename);
//파일 스트림을 저장하기 위한 바이트 배열 생성.
byte[] bytestream = new byte[(int)file.length()];
//파일 객체를 스트림으로 불러온다.
FileInputStream filestream = new FileInputStream(file);
//파일 스트림을 바이트 배열에 넣는다.
int i = 0, j = 0;

while((i = filestream.read()) != -1) {

bytestream[j] = (byte)i;

j++;

}

// 응답 스트림 객체를 생성한다.

OutputStream outStream = response.getOutputStream();

// 응답 스트림에 파일 바이트 배열을 쓴다.

outStream.write(bytestream);

outStream.close();

%>

 


<%-- Download.jsp --%>

<%@page contentType="text/html; charset=euc-kr" %>

<%@page import="java.io.*,java.net.*,javax.servlet.*,javax.servlet.http.*"%>
<%
 String realPath = "실제화일명.txt";
 String saveFileName = "저장시사용할화일.txt";

 

/* UTF8로 인코딩된 한글 이름의 파일을 다운로드 할때 경우에 해당한다.

 * 브라우저 옵션 고급에서 "URL을 항상 UTF-8로 보냄"로 체크되어 있을 경우는

 * 화일이름을 UTF8로 다시 인코딩 해 주어야 저장화일 이름이 깨지는 것을 막을 수 있다.

*/

 

saveFileName= URLEncoder.encode(saveFileName,"UTF8");

 

/** 다운로드 구현시 주의 사항

 * 보통 어플리케이션 서버를 root계정으로 돌리는 경우가 많다.

 * 이경우 잘못 하면 해킹의 기회를 제공 하는 경우가 있다.

 * 어떤 사이트를 보면 실제화일명을 파라미터로 받아서 처리 하는 경우 보안상 위험 할 수 있다.

 * 예를 들어 dowload.jsp?file=download/attach/../../../../../../etc/passwd

 * 위와같은 경우로 해커가 파라미터를 조작하면 계정 및 패스워드 화일외에 시스템 정보를

 * 얼마든지 획득 할 수 있다. 편의를 제공하기 우해 만든 다운로드 프로그램이.

 * 판단미스로 본 사이트를 해킹하는 툴로 사용 될 수 있다는 것이다.

 *  여기에서 아래와 같이 문자를 찾아서 해킹시도를 막는다.

  1.  if(realPath.indexOf("..") != -1 || realPath.indexOf("/") != -1) {
      return;
     }
  1.   PrintStream printstream = new PrintStream(response.getOutputStream(), true);
  1.   FileInputStream fin = null;
      ServletOutputStream outs = null;
  1.  try{
  1.  //이부분에서 화일객체 생성시 해킹에 사용 될 수 있다.
  1. // 가급적이면 화일명을 파라미터가 아니 DB에 가져오도록 로직을 구현하는게 좋다.
  1. //웹상에 보여주는 화일명과 실제화일명을 DB에 넣어 숨기는 것이 좋다.
  1. //여기서는 단순 다운로드 구현을 설명 하고자 걍 사용 하기로 한다.
  1.   File file = new File("/home/test/download/" + realpath);
  1.   fin = new FileInputStream(file);
     
      int ifilesize = (int)file.length();
      byte b[] = new byte[ifilesize];
  1.   String strClient = request.getHeader("User-Agent");
  1.   response.setContentLength(ifilesize);
      response.reset() ;
      response.setContentType("application/octet-stream");
     
      if(strClient.indexOf("MSIE 5.5") > -1) {
           response.setHeader("Content-Disposition", "filename=" + new String(saveFileName.getBytes(),"ISO-8859-1") + ";");
      } else {
           response.setHeader("Content-Disposition", "attachment;
  1.               filename=" +  new String(saveFileName.getBytes("EUC-KR"),"ISO-8859-1") + ";");
      }
      response.setHeader("Content-Length", ""+ifilesize );
      outs = response.getOutputStream();
      response.setHeader("Content-Transfer-Encoding", "binary;");
      response.setHeader("Pragma", "no-cache;");
      response.setHeader("Expires", "-1;");
  1.   if (ifilesize > 0 && files.isFile()) {
         int read = 0;
  1.      while((read = fin.read(b)) != -1) {
             outs.write(b,0,read);
         }
      }
     } catch (FileNotFoundException fnfe) {
         System.out.println(fnfe.toString());
     } catch (Exception e) {
         System.out.println(e.toString());
     } finally{
        try {
            if(outs != null) outs.close();
            if(fin != null) fin.close();
        } catch (Exception e) {}
     }
  1. %>

이 글은 스프링노트에서 작성되었습니다.

'JSP' 카테고리의 다른 글

엑셀파일다운로드  (0) 2012.05.08
fileDownload.jsp  (0) 2012.05.08
cubrid-dbcp설정.  (0) 2012.05.08
ERROR&cokie  (0) 2012.05.08
ss  (0) 2012.05.08
Posted by 사라링

BLOG main image
.. by 사라링

카테고리

사라링님의 노트 (301)
JSP (31)
J-Query (41)
JAVA (24)
VM-WARE (0)
디자인패턴 (1)
스크랩 (0)
스트러츠 (3)
안드로이드 (11)
오라클 (45)
우분투-오라클 (1)
이클립스메뉴얼 (6)
스프링3.0 (23)
자바스크립트 (10)
HTML5.0 (17)
정보처리기사 (1)
기타(컴퓨터 관련) (1)
문제점 해결 (3)
프로젝트 (2)
AJAX (4)
하이버네이트 (3)
트러스트폼 (11)
Jeus (2)
재무관리(회계) (5)
정규식 (5)
아이바티스 (8)
취미 (2)
소프트웨어 보안 관련모음 (0)
정보보안기사 (6)
C언어 베이직 및 프로그램 (3)
보안 관련 용어 정리 (2)
넥사크로 (6)
Total :
Today : Yesterday :