본문 바로가기
JAVA

java 자바 파일 다운로드 예제

by 쑝스토리 2019. 6. 12.
반응형

스프링 자바 파일 다운로드 java file download 예제

자바 스프링에서 파일을 다운로드 하는 예제를 올려보겠습니다. 저는 각종 문서 템플릿을 사용자들이 다운받을 수 있도록 JSP페이지에 기능을 추가 하였습니다. 파일 다운로드 로직을 유틸자바파일로 생성하고, 컨트롤러단에서 사용하였습니다. JSP 에서 url로 호출하여 사용하였습니다. 순서대로 진행하시면, 자연스럽게 이해되실꺼에요. 


1. 자바파일다운로드 코딩로직 (DownloadView.java 파일을 생성해준다.)

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.util.FileCopyUtils;

public class DownloadView {
	public void filDown(HttpServletRequest request,
			HttpServletResponse response, String filePath, String realFilNm,
			String viewFileNm) throws IOException {
		 
		File file = new File( filePath + realFilNm);
		System.out.println("root = " + filePath + realFilNm);
		if (file.exists() && file.isFile()) {
			response.setContentType("application/octet-stream; charset=utf-8");
			response.setContentLength((int) file.length());
			String browser = getBrowser(request);
			String disposition = getDisposition(viewFileNm, browser);
			response.setHeader("Content-Disposition", disposition);
			response.setHeader("Content-Transfer-Encoding", "binary");
			OutputStream out = response.getOutputStream();
			FileInputStream fis = null;
			fis = new FileInputStream(file);
			FileCopyUtils.copy(fis, out);
			if (fis != null)
				fis.close();
			out.flush();
			out.close();
		}
	}

	private String getBrowser(HttpServletRequest request) {
		String header = request.getHeader("User-Agent");
		if (header.indexOf("MSIE") > -1 || header.indexOf("Trident") > -1)
			return "MSIE";
		else if (header.indexOf("Chrome") > -1)
			return "Chrome";
		else if (header.indexOf("Opera") > -1)
			return "Opera";
		return "Firefox";
	}

	private String getDisposition(String filename, String browser)
			throws UnsupportedEncodingException {
		String dispositionPrefix = "attachment;filename=";
		String encodedFilename = null;
		if (browser.equals("MSIE")) {
			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();
		}
		return dispositionPrefix + encodedFilename;
	}
}


2. 컨트롤러단에서 객체를 생성하고 호출한다. (여기는 컨트롤러에서 서블릿 하나를 추가해줍니다.)


	// 문서템플릿 파일 다운로드
	@RequestMapping(value = "/document/fileDownload.do")
	public  void fileDownload(
			  @RequestParam("document_nm") String document_nm
			, HttpSession session
			, HttpServletRequest req
			, HttpServletResponse res
			, ModelAndView mav) throws Throwable 
	{
		try {
			DownloadView fileDown = new DownloadView(); //파일다운로드 객체생성
			fileDown.filDown(req, res, "파일경로입력" + "/" , "파일이름이력", "다운받았을때출력되는파일이름입력"); //파일다운로드 

			
		} catch (Exception e) {
			e.printStackTrace();
			logger.error(e.toString());
		}
	}

위에 한글로 표기해 논거처럼 객체를 생성한 후에, 알맞게 입력해줍니다. 파일경로입력 과 파일이름입력 은 사용자들에게 서버에서 다운시켜주고 싶은 파일경로와 파일명을 입력하면 됩니다. 마지막 다운받았을때출력되는파일이름은 말 그대로 사용자들이 다운했을때, 보여지는 파일명 입니다. 


3. JSP 파일에서 RequestMapping 으로 값을 준 url로 컨트롤러 서블릿(위에2번)을 호출한다.

  //문서다운로드
  function fn_downfile(document_nm){ 
    location.href="/document/fileDownload.do?document_nm=" + document_nm); 
  }

위와 같이 JSP파일에서 스크립트로 추가 해준 다음에, 버튼을 하나 생성하여 fn_downfile()을 호출하시면 됩니다.

document_nm 은 변수에요. 스크립트가 호출되면서 저 문서에 맞는 파라미터값을 서블릿에서 처리하며, 원하는 파일이 다운로드 되겠죠? 

반응형