티스토리 뷰

공통 설정


- Name-servlet.xml

 <!-- Download View Setting -->

<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">

  <property name="order" value="0"/>

</bean>


<!-- Download controller - view connection -->

<bean id="뷰이름" class="패키지.DownloadView" />

기존의 ViewResolver 의 property 중 id = order 인 놈의 값을 1로 설정해서 jsp뷰를 읽기전 먼저 자바클래스로만 만들어진 뷰를 읽어 오도록 해야한다. value의 값이 작을수록 우선순위가 설정된다.




1. 한글처리 이전의 다운로드

- Controller

@RequestMapping("URL")

public ModelAndView download(@RequestParam("fileName")String fileName) {

        File file = new File("c:/upload/upload_" + fileName);

        return new ModelAndView("뷰이름","downloadfile",file);

}


코드는 간단하다. 먼저 컨트롤러에 URL매핑을 해주어 URL요청을통해 컨트롤러를 호출한다. 

ex> URL?fileName=한글.jpg

똑같이 새로운 파일을 만들어 뷰에게 컨트롤러가 전송해준다.


-View

 package 패키지

import java.io.File;

import java.io.FileInputStream;

import java.io.OutputStream;

import java.net.URLEncoder;

import java.util.Map;


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import org.springframework.util.FileCopyUtils;

import org.springframework.web.servlet.view.AbstractView;


public class 뷰이름  extends AbstractView {

    public void Download() {

        setContentType("application/download; utf-8");

    }


    @Override

    protected void renderMergedOutputModel(Map<String, Object> model,HttpServletRequest request,HttpServletResponse response) throws Exception {

        File file = (File)model.get("downloadfile");

        response.setContentType(getContentType());

        response.setContentLength((int)file.length());


        String userAgent = request.getHeader("User-Agent");

        

        boolean ie = userAgent.indexOf("MSIE") > -1;


        String fileName = null;


        if(ie) {

                fileName = URLEncoder.encode(file.getName(),"utf-8");

        } else {

                fileName = new String(file.getName().getBytes("utf-8"));

        }

        response.setHeader("Content-Disposition","attachment; filename=\""+fileName+"\";");

        response.setHeader("Content-Transfer-Encoding","binary");

        OutputStream out = response.getOutputStream();

        FileInputStream fis = null;


        try {

                fis = new FileInputStream(file);

                FileCopyUtils.copy(fis,out);

        } catch (Exception e) {

                e.printStackTrace();

        } finally {

                if(fis != null) {
                        try {

                                fis.close();

                        } catch(Exception e){}

                }

        }


        out.flush();

  }

}

색이 같은부분은 이름을 똑같이 해주어야한다. 컨트롤러에서 뷰로 넘겨준값을 읽을떄 사용하는것이며 servlet설정에서 뷰이름을 설정해 주었으니 그대로 뷰에서도 사용해야한다. 진한 색글씨로 되어있는 부분은 자신이 알아서 이름 지어도 상관 없다. 


이렇게 하다보니.. 컨트롤러에서 파일이름에 한글이 있을때 ????ㅣㅏㅁㄴ위ㅏ  이런 이상한 문자들로 바뀌어져서 해당 업로드된 위치에서 파일을 올바로 가져 오지를 못했다. 그래서 곰곰히 읽어보다 컨트롤러에서 한글이 깨진다는것을 발견! 그래서 컨트롤러에서 파일이름을 utf형식으로 처리 해주어야 겟다. 혹 폴더에 한글이 있을경우에도 같은 방법으로 path를 지정해주면 될것이다.



2. 한글처리 

-controller

 

@RequestMapping("URL")

public ModelAndView download(@RequestParam("fileName")String fileName) {

        String fname = null

        try {

fname = new String(fileName.getBytes("8859_1"),"utf-8");

} catch (UnsupportedEncodingException e) {

// TODO 자동 생성된 catch 블록

e.printStackTrace();

}

        File file = new File("c:/upload/upload_" + fname);

        return new ModelAndView("뷰이름","downloadfile",file);

}





'Springframework' 카테고리의 다른 글

[Spring framework] 웹 어플리케이션 처리 플로우  (0) 2013.03.26
[Spring Framework] 기초 01.  (0) 2013.03.25
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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 31
글 보관함