[jsp] a 태그를 이용한 다운로드 기능 :: 개발/일상_Mr.lee

[jsp] a 태그를 이용한 다운로드 기능

Posted by Mr.mandu.
2018. 2. 12. 14:07 개발/web, html5,jsp

안녕하세요.

jsp 단에서 a링크를 이용하여 파일을 다운로드를 해 보겠습니다.


사실 제일 간단한 방법은 서버에 있는 경로를 바로 넣어주시면 됩니다.


<a href="<c:url value="/wcom/manual/Kiss_manual.zip"/>" >테스트파일</a>


이렇게 해주시면됩니다.

경로는 webapp 하위로 잡아주시면 됩니다.


또한가지의 방법은

<a href="<c:url value="/fileDown.do?fileDir=/wcom/manual&fileName=test.jpg"/>">테스트 파일</a>


다른 jsp 를 호출한 방법입니다.

/fileDown.do?  <<< 이부분으로 컨트롤러를 통해 jsp 화면으로 갑니다.


jsp 에서 호출한 컨트롤러 입니다.


 /** 파일 다운로드 jsp 모듈 */
		@RequestMapping("/fileDown.do")
		public String fileDown(HttpServletRequest req , ModelMap modelMap) throws Exception {
			String fileName = req.getParameter("fileName");
			String fileDir =  req.getParameter("fileDir");
			
			modelMap.put("fileName", fileName);
			modelMap.put("fileDir", fileDir);
			return "/comm/filedown/filedown";
		}

사실 별다른 모듈은 없습니다.

이제 중요한 jsp 소스 입니다.

<%@page import="kiss.KissCodeConstants"%>
<%@page import="kiss.KissConstants"%>
<%@ page import="java.io.File" %>

<%@ page import="java.io.*"%>
<%@ page import="java.net.URLEncoder"%>

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>





파일다운로드



<%
	String fileName = request.getParameter("fileName");
    String fileDir = request.getParameter("fileDir");
    
    //파일명 인코딩
    String UTF8FileName = new String(fileName.getBytes("8859_1"), "UTF-8");

    //실제 파일
	String filePath = KissConstants.getServerUrl()+ "/src/main/webapp" + fileDir + "/" + fileName;
	
	boolean MSIE = request.getHeader("user-agent").indexOf("MSIE") != -1;
	if(MSIE){
        // 브라우저가 IE일 경우 저장될 파일 이름
        // 공백이 '+'로 인코딩된것을 다시 공백으로 바꿔준다.
        fileName = URLEncoder.encode(UTF8FileName, "UTF8").replaceAll("\\+", " ");
    }else{
        // 브라우저가 IE가 아닐 경우 저장될 파일 이름
        fileName = new String(UTF8FileName.getBytes("UTF-8"), "8859_1");
    }
	try{

		out.clear();
		out = pageContext.pushBody();

		File file = new File(filePath);

		byte b[] = new byte[1024];

		response.reset();

		//response.setContentType("application/octet-stream");
		response.setHeader("Content-Type", "application/octet-stream;");
		response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\";");

		FileInputStream fis = new FileInputStream(filePath);
		BufferedInputStream bis = new BufferedInputStream(fis);
		BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());

		int numRead;

		while((numRead = bis.read(b,0,b.length)) != -1){
			bos.write(b,0,numRead);
		}
		bos.flush();
		bos.close();
		bis.close();

	}catch(Exception e){

		e.printStackTrace();

	}
%>	





자바단에서 이루어지는 로직을 jsp로 옮겨두는것 뿐입니다.

서버에 있는 파일을

FileInputStream으로 읽어 BufferdOutputStream으로 쏴주는 로직입니다.


이렇게 적어두고 나중에 바로바로 써먹어야겠습니다.

나중에 찾으려면 이것저것 바꿔보고 은근 시간 소비될때가 있거든요..

그럼 ~ 감사합니다!