자바에서 파일을 다운로드를 할 수 있는 유틸을 생성해서 공통으로 호출하여 사용할 수 있도록 구현해보았다. 아래와 같이 구현하면 쉽게 사용할 수 있으니, 참고바란다.

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);
    		}
		}
	}
}
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기