package com.aperture_software.glados_wiki.support; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.ObjectUtils; import org.springframework.stereotype.Component; import com.google.common.io.Closer; /** * 파일 다운로드 처리. * * @author jhyun * @since 2013-Oct-14-Mon */ @Component public class HttpFileDownload { /** * HTTP으로 사용자에게 파일을 다운로드하도록 전달. * * @param resultFilename * 사용자 웹브라우저에서 저장할 때 표시할 파일 이름. * @param mimeType * 파일의 MIME 타입 문자열. (예: text/html ...) * @param file * 전달할 WAS서버측에 존재하는 파일. * @param response * @throws java.io.IOException */ public void downloadFile(final String resultFilename, final String mimeType, File file, HttpServletResponse response) throws IOException { // Closer closer = Closer.create(); FileInputStream is = new FileInputStream(file); closer.register(is); downloadInputStream(resultFilename, mimeType, is, response); closer.close(); } /** * HTTP으로 사용자에게 {@link java.io.InputStream}을 다운로드. * * @param resultFilename * 사용자 웹브라우저에서 저장할 때 표시할 파일 이름. * @param mimeType * 파일의 MIME 타입 문자열. * @param is * 전달할 파일 내용의 {@link java.io.InputStream} * @param response * @throws java.io.IOException */ public void downloadInputStream(final String resultFilename, final String mimeType, InputStream is, HttpServletResponse response) throws IOException { // if (is == null) throw new IOException("GIVEN InputStream IS NULL!"); // String fn = filenameForHttpHeader(resultFilename, "UTF-8"); // response.setHeader("Content-Transfer-Encoding", "binary"); response.setContentType(mimeType); response.setHeader("Content-Disposition", String.format("attachment; filename=%s;", fn)); // Closer closer = Closer.create(); OutputStream os = null; try { os = response.getOutputStream(); closer.register(os); IOUtils.copy(is, os); response.flushBuffer(); } finally { closer.close(); } } /** * HTTP헤더로 전달하기 적절하게 인코딩. * * @param filename * @param charsetName * @return * @throws java.io.UnsupportedEncodingException */ private String filenameForHttpHeader(final String filename, final String charsetName) throws UnsupportedEncodingException { // String fn = URLEncoder.encode(ObjectUtils.toString(filename), charsetName).replaceAll("\\+", "\\ "); return fn; } }