<!-- fileDownload -->
<beans:bean id="fileDownLoadView" class="com.ssafy.board.view.FileDownLoadView"/>
<beans:bean id="fileViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver">
<beans:property name="order" value="0" />
</beans:bean>
fileDownLoadView라는 클래스를 만들어서 fileDownLoadView라는 이름으로 DI하겠다는 것이다.
BeanNameViewResolver를 통해(order로 순서를 가장 먼저 최상위로 한다.)
ViewResolver가 다른 페이지를 찾기 전에, 해당 클래스가 존재하면, 클래스로 찾아가게 도와준다.
<a href="#" class="filedown" sfolder="${file.saveFolder}" sfile="${file.saveFile}" ofile="${file.originalFile}">[다운로드]</a>
<form id="downform" action="${root}/board/download">
<input type="hidden" name="sfolder">
<input type="hidden" name="ofile">
<input type="hidden" name="sfile">
</form>
<script>
let files = document.querySelectorAll(".filedown");
files.forEach(function(file) {
file.addEventListener("click", function() {
document.querySelector("[name='sfolder']").value = file.getAttribute("sfolder");
document.querySelector("[name='ofile']").value = file.getAttribute("ofile");
document.querySelector("[name='sfile']").value = file.getAttribute("sfile");
document.querySelector("#downform").submit();
});
});
</script>
@GetMapping(value = "/download")
public ModelAndView downloadFile(@RequestParam("sfolder") String sfolder, @RequestParam("ofile") String ofile, @RequestParam("sfile") String sfile, HttpSession session) {
Map<String, Object> fileInfo = new HashMap<String, Object>();
fileInfo.put("sfolder", sfolder);
fileInfo.put("ofile", ofile);
fileInfo.put("sfile", sfile);
return new ModelAndView("fileDownLoadView", "downloadFile", fileInfo);
}
public class FileDownLoadView extends AbstractView {
public FileDownLoadView() {
setContentType("apllication/download; charset=UTF-8");
}
@Override
protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
Map<String, Object> fileInfo = (Map<String, Object>) model.get("downloadFile"); // Controller에서 downloadFile이라는 이름으로 보내줬기 때문
/* 생략 */
File file = new File(realPath + File.separator + saveFolder, saveFile);
response.setContentType(getContentType());
response.setContentLength((int) file.length());
String header = request.getHeader("User-Agent");
boolean isIE = header.indexOf("MSIE") > -1 || header.indexOf("Trident") > -1;
String fileName = null;
if (isIE) {
fileName = URLEncoder.encode(originalFile, "UTF-8").replaceAll("\\+", "%20");
} else {
fileName = new String(originalFile.getBytes("UTF-8"), "ISO-8859-1");
}
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\";");
response.setHeader("Content-Transfer-Encoding", "binary");// 이것을 해야 사진을 다운 받아도 보여주지 않고 다운로드 하게 된다.
OutputStream out = response.getOutputStream();
FileInputStream fis = null;
fis = new FileInputStream(file);
FileCopyUtils.copy(fis, out);
fis.close();
out.flush();