1. servlet-context.xml (XML 설정)
(1) BeanNameViewResolver 추가.
여기서 중요한 것은 property의 value값을 꼭 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에서 설정했던 bean의 id값인 fileDownload의 view 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();
}
}
'Framework > Spring' 카테고리의 다른 글
[Spring] 스프링 파일업로드/ file upload/ 파일업로드 한글깨짐 (4) | 2016.09.28 |
---|---|
[Spring Boot 시작하기] maven 프로젝트 생성 / 스트링부트 톰캣포트 변경 (0) | 2016.09.21 |
[Spring] SpEL을 사용한 Spring Properties 사용방법 / properties 설정 (0) | 2016.08.17 |
[Spring] 스프링 파일 사이즈 에러 / 업로드 파일크기 / MaxUploadSizeExceededException (0) | 2016.08.09 |
[Spring] ajax 404 해결방법 / @ResponseBody (0) | 2016.08.05 |