반응형
연관 글 : 파일 업로드 (cos.jar)
2019.05.11 - [IT&프로그래밍/Java] - Java | 파일 업로드 (cos.jar)
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;
}
}
반응형
'개발_웹 > Java' 카테고리의 다른 글
Java | Java의 객체 직렬화 (Serialization) (0) | 2021.02.17 |
---|---|
Java | Java에서 Swap 함수 구현 (Java의 call-by-reference) (0) | 2021.02.17 |
Java | 파일 업로드 (cos.jar) (0) | 2019.05.11 |
Java | 파일 복사하기 (텍스트, 바이너리) (0) | 2019.05.11 |
Java | 에러 페이지 만들기 (0) | 2019.05.11 |