티스토리 뷰
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DownloadFile {
/**
* 파일 다운로드
*
* @param filePath: 파일명.ext을 포함한 전체 경로
* @param fileName: 파일명.ext
* @param request
* @param response
* @throws Exception
*/
public static void fileDownload(String filePath, String fileName, HttpServletRequest request, HttpServletResponse response) throws Exception {
response.reset();
// IE 체크
if (request.getHeader("User-Agent").indexOf("MSIE5.0") > -1) {
// IE 아닐 경우
response.setHeader("Content-Type", "doesn/matter;");
} else {
// IE 일경우
response.setHeader("Content-Type", "application/unknown");
}
setDisposition(fileName, request, response);
// *** 파일 다운로드
File fp = new File(filePath);
int read = 0;
byte[] b = new byte[(int) fp.length()]; // 파일 크기
if (fp.isFile()) {
BufferedInputStream fin = new BufferedInputStream(new FileInputStream(fp));
BufferedOutputStream outs = new BufferedOutputStream(response.getOutputStream());
// 파일 읽어서 브라우저로 출력하기
try {
while ((read = fin.read(b)) != -1) {
outs.write(b, 0, read);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (outs != null) {ㅣ
outs.close();
}
if (fin != null) {
fin.close();
}
}
}
}
/**
* 헤더의 Content-Disposition 지정
*
* @param filename
* @param request
* @param response
* @throws Exception
*/
private static void setDisposition(String filename, HttpServletRequest request, HttpServletResponse response)
throws Exception {
String browser = getBrowser(request);
String dispositionPrefix = "attachment; filename=";
String encodedFilename = null;
if (browser.equals("MSIE")) {
encodedFilename = URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", "%20");
} else if (browser.equals("Trident")) { // IE11 문자열 깨짐 방지
encodedFilename = "\"" + URLEncoder.encode(filename, "UTF-8").replaceAll("\\+", "%20") + "\"";
} else if (browser.equals("Firefox")) {
encodedFilename = "\"" + new String(filename.getBytes("UTF-8"), "8859_1") + "\"";
} else if (browser.equals("Opera")) {
encodedFilename = "\"" + new String(filename.getBytes("UTF-8"), "8859_1") + "\"";
} else if (browser.equals("Chrome")) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < filename.length(); i++) {
char c = filename.charAt(i);
if (c > '~') {
sb.append(URLEncoder.encode("" + c, "UTF-8"));
} else {
sb.append(c);
}
}
encodedFilename = sb.toString();
} else {
throw new IOException("Not supported browser");
}
response.setHeader("Content-Disposition", dispositionPrefix + encodedFilename);
response.setHeader("Content-Transfer-Encoding", "binary;");
if ("Opera".equals(browser)) {
response.setContentType("application/octet-stream;charset=UTF-8");
}
}
/**
* 브라우저 구분값 반환
*
* @param request
* @return
*/
public static String getBrowser(HttpServletRequest request) {
String agent = request.getHeader("User-Agent");
if (agent.indexOf("MSIE") > -1) {
return "MSIE";
} else if (agent.indexOf("Trident") > -1) {
return "Trident";
} else if (agent.indexOf("Chrome") > -1) {
return "Chrome";
} else if (agent.indexOf("Opera") > -1) {
return "Opera";
}
return "Firefox";
}
}
댓글