개발_웹/Java

Java | 파일 다운로드

zuyo 2019. 5. 11. 15:27
반응형

연관 글 : 파일 업로드 (cos.jar)

2019.05.11 - [IT&프로그래밍/Java] - Java | 파일 업로드 (cos.jar)

 

Java | 파일 업로드 (cos.jar)

1. cos.jar 라이브러리 다운로드 http://www.servlets.com/cos/ Servlets.com | com.oreilly.servlet www.servlets.com 2. 프로젝트에 cos.jar 라이브러리 추가 3. 업로드 경로 생성 4. 업로드 form 5. 서블릿 @..

zuyo.tistory.com

 

 

JSP에서 파일 다운로드를 구현하는 가장 간단한 방법은 <a>태그를 사용하는 것이다. 단, 이 때는 .zip과 같은 바이너리 파일만 다운로드 창을 통해 받을 수 있으며, 문서나 이미지 파일 등은 브라우저에서 직접 출력한다.

파일 타입을 바이너리로 강제 설정하여 다운로드 창을 통해 받는 방법을 구현해보자. (파일 업로드 과정은 생략, DB에 파일명이 저장되어 있음)


1. 다운로드 링크

파일명 혹은 ID값을 서블릿(컨트롤러)로 넘겨준다.

<a href="FileDownloadServlet?fileName=${imageFile.fileName}">다운로드</a>

 

2. 서블릿 (컨트롤러)

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 파일 객체 생성
		String realPath = request.getServletContext().getRealPath(EPath.MIDDLEPATH.getValue());
		String fileName = request.getParameter("fileName");
		File file = new File(realPath + "/" + fileName);
		
		// 파일 존재 시 다운로드 수행
		if(file.exists() && file.isFile()) {
			// 파일 타입 설정
			String mimeType = getServletContext().getMimeType(file.toString());
			if(mimeType == null) {
				// 바이너리 파일이어야 다운로드 창을 이용하여 받을 수 있기 때문에 ContentType을 8비트 바이너리로 설정
				response.setContentType("application/octet-stream");
			}
			
			// 브라우저 별 설정
			String strClient = request.getHeader("user-agent");
			if(strClient.indexOf("MSIE 5.5") != -1) { // IE 5.5
				response.setHeader("Content-Disposition", "fileName="+fileName+";");
			} else {
				// 파일을 브라우저에서 보여줄지 로컬로 다운로드 받을 지 설정. Content-Disposition 헤더가 attachment 속성을 가지면 다운로드 함
				response.setHeader("Content-Disposition", "attachment; fileName="+fileName+";");
			}
			
			// 스트림 생성
			FileInputStream fileInputSteam = new FileInputStream(file);
			ServletOutputStream servletOutputStream = response.getOutputStream();
			
			// 버퍼 생성
			byte[] buffer = new byte[1024];
			
			// 브라우저로 파일 전송
			int readData = 0;
			while((readData=(fileInputSteam.read(buffer, 0, buffer.length))) != -1) {
				servletOutputStream.write(buffer, 0, readData);
			}
			
			// 스트림 닫기
			servletOutputStream.flush();
			servletOutputStream.close();
			fileInputSteam.close();
		}
	}

 

* 파일 경로는 Enum 사용 (하드코딩 방지)

public enum EPath {
	MIDDLEPATH("resources/image"),
	THUMBPATH("thumbnail");
	
	String value;
	
	private EPath(String value) {
		this.value = value;
	}

	public String getValue() {
		return value;
	}
}

 

반응형