package kr.wisestone.owl.web.view; import kr.wisestone.owl.annotation.Viewer; import kr.wisestone.owl.vo.AttachedFileVo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.util.FileCopyUtils; import org.springframework.web.servlet.view.AbstractView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; import java.util.Map; @Viewer public class FileDownloadView extends AbstractView { private static final Logger LOGGER = LoggerFactory.getLogger(FileDownloadView.class); public FileDownloadView() { super.setContentType("application/octet-stream"); } @Override protected void renderMergedOutputModel(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception { AttachedFileVo attachedFileVo = (AttachedFileVo) model.get("fileDownloadTarget"); response.setContentType(super.getContentType()); response.setContentLength(attachedFileVo.getSize().intValue()); response.setHeader("Content-Transfer-Encoding", "binary"); String userAgent = request.getHeader("User-Agent"); // attachment; 가 붙으면 IE의 경우 무조건 다운로드창이 뜬다. 상황에 따라 써야한다. if (userAgent != null && userAgent.indexOf("MSIE 5.5") > -1) { // MS IE 5.5 이하 response.setHeader("Content-Disposition", String.format("filename=%s;", URLEncoder.encode(attachedFileVo.getName(), "UTF-8"))); } else if ((userAgent != null && userAgent.indexOf("MSIE") > -1) || userAgent.indexOf("Trident") > -1) { // MS IE (보통은 6.x 이상 가정) response.setHeader("Content-Disposition", String.format("attachment; filename=%s;", URLEncoder.encode(attachedFileVo.getName(), "UTF-8"))); } else { // 모질라, 오페라, 크롬 등 response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\";", new String(attachedFileVo.getName().getBytes("UTF-8"), "latin1"))); } OutputStream outputStream = null; InputStream inputStream = null; try { outputStream = response.getOutputStream(); inputStream = new ByteArrayInputStream(attachedFileVo.getBytes()); FileCopyUtils.copy(inputStream, outputStream); } catch (IOException ioe) { LOGGER.error("다운로드 파일 제어 중 오류가 발생했습니다.", ioe); throw ioe; } finally { if (inputStream != null) inputStream.close(); if (outputStream != null) { outputStream.flush(); outputStream.close(); } } } }