Spring Framework 에서 File download 를 쉽게 구현이 가능합니다.
전체적인 로직은 파일 다운로드 URL 요청 시 해당 파일을 찾아 JSP 페이지가 아닌 Class 로 구현된 View 로 연결하여 Stream으로 요청한 Client 쪽으로 전달합니다.
1. dispatcher-servlet.xml 파일에 bean 등록
<bean id="fileDownloadView" class="com.util.FileDownloadView"/>
<bean id="fileViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="0"/>
</bean>
| cs |
2. view 역활을 대신 할 class를 생성
public class FileDownloadView extends AbstractView{
public FileDownloadView(){
//content type을 지정.
setContentType("apllication/download; charset=utf-8");
}
@Override
protected void renderMergedOutputModel(Map<String, Object> model,
HttpServletRequest req, HttpServletResponse res) throws Exception {
// TODO Auto-generated method stub
File file = (File) model.get("downloadFile");
res.setContentType(getContentType());
res.setContentLength((int) file.length());
res.setHeader("Content-Disposition", "attachment; filename=\"" +
java.net.URLEncoder.encode(file.getName(), "utf-8") + "\";");
res.setHeader("Content-Transfer-Encoding", "binary");
OutputStream out = res.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 (IOException e) {
e.printStackTrace();
}
}
}
out.flush();
}
}
| cs |
3. 파일 다운로드 요청 URL에서 생성한 View로 전달합니다.
@RequestMapping(value = "/call/callDownload.do")
public ModelAndView callDownload(@RequestParam (value="fileFullPath") String fileFullPath,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
LOGGER.debug("callDownload : "+ fileFullPath);
File downloadFile = new File(fileFullPath);
if(!downloadFile.canRead()){
throw new Exception("File can't read(파일을 찾을 수 없습니다)");
}
return new ModelAndView("fileDownloadView", "downloadFile",downloadFile);
}
| cs |