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;
}
}