자바에서 파일을 다운로드를 할 수 있는 유틸을 생성해서 공통으로 호출하여 사용할 수 있도록 구현해보았다. 아래와 같이 구현하면 쉽게 사용할 수 있으니, 참고바란다.
JAVA FILE DOWN UTIL 만들기 - 유틸을 생성해서 공통으로 호출해서 사용하면 된다.
public class DownloadFile extends HttpServlet {
private static Logger log = LogManager.getLogger(DownloadFile.class);
@edu.umd.cs.findbugs.annotations.SuppressWarnings({
"PATH_TRAVERSAL_IN",
"SERVLET_HEADER_USER_AGENT",
"SERVLET_PARAMETER",
"WEAK_FILENAMEUTILS"})
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String isRuntime = "N";
String osName = System.getProperty("os.name");
String userAgent = request.getHeader("User-Agent");
String savePath = request.getParameter("path");
String filename = request.getParameter("fileName");
filename = URLDecoder.decode(filename, "UTF-8");
String filePath = savePath;
byte[] buffer = new byte[1024];
ServletOutputStream outputStream = null;
BufferedInputStream inputStream = null;
if(filePath.indexOf("..") != -1) {
log.info("파일경로가 비정상적입니다.");
response.sendError(403);
//throw new UserException("파일경로가 비정상적입니다.");
} else {
File fis = new File(FilenameUtils.getFullPath(filePath), FilenameUtils.getName(filePath));
if (fis.exists()) {
try {
filename = URLEncoder.encode(filename, "UTF-8");
filename = filename.replaceAll("\\+", "%20");
response.setContentType("application/octet;charset=utf-8");
if (isRuntime != null && isRuntime.equals("N")) {
if (userAgent.indexOf("MSIE") > -1) {
response.setHeader("Content-Disposition", "attachment; filename = \"" + filename + "\"");
response.setHeader("Content-Transper-Encoding", "binary");
} else {
response.setHeader("Content-Disposition", "attachment; filename = \"" + filename + "\"");
}
response.setHeader("Content-Transper-Encoding", "binary");
response.setHeader("Content-Length", String.valueOf(fis.length()));
response.setHeader("Pargma", "no-cache");
response.setHeader("Expires", "-1");
} else {
response.setHeader("Content-Disposition", "attachment; filename = \"" + filename + "\"");
response.setHeader("Content-Transper-Encoding", "binary");
response.setHeader("Content-Length", String.valueOf(fis.length()));
}
outputStream = response.getOutputStream();
inputStream = new BufferedInputStream(new FileInputStream(fis));
int intTmp = 0;
intTmp = inputStream.read(buffer, 0, 1024);
while (intTmp != -1) {
outputStream.write(buffer, 0, intTmp);
intTmp = inputStream.read(buffer, 0, 1024);
}
} catch (FileNotFoundException e) {
log.info(e.getMessage().replaceAll("[\r\n]",""));
} finally {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.close();
}
}
} else {
log.info("fileDownload filename==>" + filename.replaceAll("[\r\n]","") + ", 파일없음.");
response.sendError(404);
}
}
}
}