티스토리 뷰

DB에서 받아온 데이터를 웹페이지에서 CSV 파일로 다운받게 하기.

아래는 한글 깨지는것도 처리 해놓은 방법임!


이렇게하면 CSV파일을 어딘가에 저장하지 않고도 바로 다운로드 할 수 있음.



옛~날에 PHP로 해봤으면서 왜 자바에서는 흐름도 못잡고 몇일을 삽질 했을까ㅠㅠㅠㅠㅠ




1. HTML 페이지에서 다운로드 링크를 건다.


<a href="total">엑셀파일다운로드</a> 



2. Controller (Action)


1번에서 링크 클릭하면 타고 들어오는 액션..


@RequestMapping("/total")
public ResponseEntity<String> getTotalList() {


   List<Total> totalList =  totalService.getTotal(); // DB에서 가져온 데이터리스트


   HttpHeaders header = new HttpHeaders();

   header.add("Content-Type", "text/csv; charset=MS949");

   header.add("Content-Disposition", "attachment; filename=\"" + "total.csv" + "\"");


   return new ResponseEntity<String>(setContent(totalList), header, HttpStatus.CREATED);


@ResponseBody 어노테이션 쓰고 한글 리턴했더니 글자가 ?? 이렇게 나옴


http://dptablo.tistory.com/188  <- 이 블로그 보고 알았는데... 

@ResponseBody 대신 ResponseEntity로 하니까 된다.


CSV는 UTF-8로 하면 깨지고, MS949 로 세팅해야 된다.


setContent있는 부분에는 스트링 데이터를 넣는다. 3번 참고.



3. setContent()에서 CSV 파일에 들어갈 내용 만들기


CSV는 , 와 개행문자로 구분 된다.


아래와 같은 CSV를 만들고 싶다면,


String data = "가, 나, 다, \n 1, 2, 3"; 으로 만들면 된다.


가 

나 

다 



4. 인코딩 문제 해결을 위한 설정


아래 설정을 context 설정 파일에 세팅한다.


<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">

   <property name="messageConverters">

       <list>

          <bean class="org.springframework.http.converter.StringHttpMessageConverter">

              <property name="supportedMediaTypes">

                  <value>text/plain;charset=UTF-8</value>

              </property>

          </bean>

       </list>

   </property>

</bean>


참고로 프로젝트 전체가 UTF-8로 맞춰져 있었고 CSV 내려줄때만 인코딩을 MS949로 했다는거~



댓글
  • 프로필사진 개발자 인터넷 익스플로러에서는 다운로드가 안되는데 혹시 방법 아시는지요?
    ㅠㅠ
    2014.12.02 17:18 신고
  • 프로필사진 신매력 옛날이라 익스에서 했었는지 기억은 안나지만, 브라우저 버전 호환성 문제일 수도 있을 것 같아요. F12누르고 문서모드를 바꿔보세요~ 2015.01.09 12:12 신고
댓글쓰기 폼