Spring 파일 다운로드

오의석·2022년 10월 20일

스프링

목록 보기
8/16
<!-- 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가 다른 페이지를 찾기 전에, 해당 클래스가 존재하면, 클래스로 찾아가게 도와준다.

  1. html 및 jsp 세팅
<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>
  1. Controller 세팅
@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();
profile
끊임없이 나아가는 사람이 되어볼게요.

0개의 댓글