JSP에서 파일 다운로드
1. 다음과 같이 sec01.ex02 패키지를 만들고 FileDownload 서블릿을 생성합니다. 이어서 test02 폴더를 만들고 실습 파일 first.jsp와 result.jsp를 추가합니다.

2. 첫 번째 JSP에서 다운로드할 이미지 파일 이름을 두 번째 JSP로 전달하도록 first.jsp를 작성합니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
request.setCharacterEncoding("utf-8");
%>
<html>
<head>
<meta charset="UTF-8">
<title>파일 다운로드 요청하기</title>
</head>
<body>
<form method="post" action="result.jsp" >
<input type=hidden name="param1" value="cartoon-lifestyle-summertime-scene.jpg" /> <br>
<input type=hidden name="param2" value="flowers-plants-copy-space-background.jpg" /> <br>
<input type ="submit" value="이미지 다운로드">
</form>
</body>
</html>
3. 두 번째 JSP인 result.jsp를 다음과 같이 작성합니다. 이미지 파일 표시창에서 <img> 태그의 src 속성에 다운로드를 요청할 서블릿 이름 download.do와 파일 이름을 GET 방식으로 전달합니다. 다운로드한 이미지 파일을 바로 <img> 태그에 표시하고, <a> 태그를 클릭해 서블릿에 다운로드를 요청하면 파일 전체를 로컬 PC에 다운로드합니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"
isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<%
request.setCharacterEncoding("utf-8");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<c:set var="file1" value="${param.param1}"/>
<c:set var="file2" value="${param.param2}"/>
<title>이미지 파일 출력하기</title>
</head>
<body>
매개변수 1:
<c:out value="${file1}" /><br>
매개변수 2:
<c:out value="${file2}" /><br>
<c:if test="${not empty file1}">
<img src="${contextPath}/download.do?fileName=${file1}" width=300 height=300 /><br>
</c:if>
<c:if test="${not empty file2}">
<img src="${contextPath}/download.do?fileName=${file2}" width=300 height=300 /><br>
</c:if>
파일 내려받기 :<br>
<a href="${contextPath}/download.do?fileName=${file2}" />
파일 내려받기 </a><br>
</body>
</html>
4. 파일 다운로드 기능을 할 서블릿인 FileDownload 클래스를 다음과 같이 작성합니다. 파일 다운로드 기능은 자바 IO를 구현합니다. 먼저 response.getOutputStream();를 호출해 OutputStream을 가져옵니다. 그리고 배열로 버퍼를 만든 후 while 반복문을 이용해 파일에서 데이터를 한 번에 8KB씩 버퍼에 읽어옵니다. 이어서 OutputStream의 write() 메서드를 이용해 다시 브라우저로 출력합니다.
package sec01.ex02;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class FikeDownload
*/
@WebServlet("/download.do")
public class FikeDownload extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request, response);
}
private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
String file_repo="C:\\file_repo";
String fileName = (String)request.getParameter("fileName");
System.out.println("fileName=" + fileName);
OutputStream out = response.getOutputStream();
String downFile = file_repo + "\\" + fileName;
File f = new File(downFile);
response.setHeader("Cache-Control", "no-cache");
response.addHeader("Content-disposition", "attachment; fileName=" + fileName);
FileInputStream in = new FileInputStream(f);
byte[] buffer = new byte[1024*8];
while(true) {
int count = in.read(buffer);
if (count == -1) {
break;
}
out.write(buffer, 0, count);
}
in.close();
out.close();
}
}
5. http://localhost:8080/pro15/test02/first.jsp로 요청한 후 이미지 다운로드를 클릭합니다.

6. 업로드한 이미지가 브라우저에 출력되면 파일 내려받기를 클릭해 로컬 PC에 파일을 저장합니다.


'프로그래밍 언어 > 자바 웹' 카테고리의 다른 글
| HTML5에 추가된 웹 페이지 구조 관련 태그 (0) | 2026.04.25 |
|---|---|
| HTML5 주요 개념 (0) | 2026.04.22 |
| JSP 페이지에서 파일 업로드 (0) | 2026.04.16 |
| 파일 업로드 관련 API (0) | 2026.04.13 |
| JSP에서 파일 업로드 (1) | 2026.04.11 |