본문 바로가기
Framework/Spring

[Spring] 스프링 파일 다운로드 / spring file download / 파일 다운로드 예제

by 나비와꽃기린 2016. 8. 19.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

1. servlet-context.xml (XML 설정)

(1) BeanNameViewResolver 추가.

여기서 중요한 것은 propertyvalue값을 0으로 해줘야 한다는 것 !!!!

우선순위를 0으로 줌으로써 해당 bean을 먼저 찾은 후, 없으면

그 다음 보통 사용하던 InternalResourceViewResolver 을 찾게 되는 것.

<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="0"/>
</bean>

InternalResourceViewResolver의 우선순위는 BeanNameViewResolver보다 낮기만 하면 된다.

<bean id="viewResolvers"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
           <property name="order" value="2" />
           <property name="prefix" value="/WEB-INF/jsp/" />
           <property name="suffix" value=".jsp" />
</bean>


(2) Class 추가

bean을 생성한 클래스를 만들어준다.

이 클래스 파일이 파일을 직접 읽어와서 스트림으로 내려주는 역할을 하게 된다.

이때 id값은 마음대로 해도 상관없고, class도 원하는 위치 패키지에 원하는 클래스명으로 생성

한 풀 경로를 적어주면 된다.

<bean id="fileDownload" class="com.epplt.app.util.DownloadView"/>


2. JSP > (다운로드 버튼 or 다운로드 파일클릭)


JSP에서 다운로드 할 파일을 클릭했다. 는 부분부터 천천히 거슬러 올라가보자.

이때 해당 파일의 물리적 위치의 경로를 보내준다. 필자의 소스는 다음과 같다.

//중략…
 
$("a[fileList]").on('click',function(){
_this.fileDownload($(this));
});
 
//중략…
 
//파일 다운로드
,fileDownload : function(Obj){
          
           var params={
                      filePath : Obj.attr("filePath")
           };
          
           var url='';   
           location.href = url;
          
}


3. Controller (view호출)


jsp에서 호출한 url에 매핑된 controller 소스이다.

해당 controller에서는 다운로드 할 파일의 물리적인 경로를 파라미터(filePath)로 받아

ModelAndView 객체를 통해 downloadFile 이라는 명으로 파일을 삽입시켜

위에서 xml에서 설정했던 beanid값인 fileDownloadview Class로 보내주는 역할을한다.

@RequestMapping(value = "/epplt/download") 
public ModelAndView download(HttpServletRequest req, HttpServletResponse res, ModelAndView mav) {
          
           Map resultMap = new HashMap();
            String fullPath = req.getParameter("filePath");
            File file = new File(fullPath);
            
            return new ModelAndView("fileDownload", "downloadFile", file);
 //파일을 downloadFile 이라는 이름으로 삽입시켜 servlet의 download에 매핑된 view Class로 간다.
}


4. Download Class 


public class DownloadView extends AbstractView {
 
public void Download(){
   setContentType("application/download; utf-8");
}
 
//파일 다운로드
@Override
protected void renderMergedOutputModel(Map paramMap, HttpServletRequest request,
                      HttpServletResponse response) throws Exception {
 
                      File file = (File)paramMap.get("downloadFile");
            
                      response.setContentType(getContentType());
                      response.setContentLength((int)file.length());
                       
                      Map map =new HashMap();
                      map.put("fileNm", file.getName() );
                      String temp_fileName=fileService.getFileOrigNm( map );
                      String ori_fileName = getDisposition(temp_fileName, getBrowser(request));
                     
                      response.setHeader("Content-Disposition", "attachment; filename=\"" + ori_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();
                     
}
}