brograming
파일 다운로드_Day38 본문


@WebServlet("/down/list")
package download;
import java.io.File;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
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 DownList
*/
@WebServlet("/down/list")
public class DownList extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public DownList() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
request.setCharacterEncoding("euc-kr");
response.setCharacterEncoding("euc-kr");
response.setContentType("text/html; charset=EUC-KR");
//디렉토리에 있는 파일 목록 읽어오는 코드 작성
String downDir = "c:\\down\\";
File dir = new File(downDir); //디렉토리 정보 객체 생성
String[] flist = dir.list(); //파일 목록 반환 {"1.jpg", "2.jpg"};
request.setAttribute("flist", flist);
RequestDispatcher dis = request.getRequestDispatcher("/down/list.jsp");
dis.forward(request,response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
@WebServlet("/down/test")
//다운로드 폴더
String downDir = "C:\\down\\";
//사용자가 클릭한 파일명
String fname = request.getParameter("fname");
String path = downDir + fname;// 다운로드할 파일 전체 경로
//파일에 대한 정보. 파일크기, 읽기, 쓰기, 실행 가능, 존재하는지 유무....
File file = new File(path);
//다운로드 파일의 내용을 읽을 스트림 생성
FileInputStream in = new FileInputStream(path);
//파일명 인코딩
fname = new String(fname.getBytes("euc-kr"), "8859_1");
//다운로드 응답을 보내기 위한 response 설정
//setContentType(): 파일의 마임설정. 파일의 종류.
//octet-stream: 바이너리 파일 한 종류
response.setContentType("application/octet-stream");
//헤더 설정. 패킷의 중요 정보를 설정. 첨부파일 전송 설정
response.setHeader("Content-Disposition", "attachment; filename=" + fname);
//다운로드 파일 내용을 response에 출력할 출력 스트림 획득
OutputStream os = response.getOutputStream();
int length;
//다운로드 파일에서 읽은 내용을 담을 byte배열을 파일 크기와 동일하게 생성
byte[] b = new byte[(int) file.length()];
//파일에서 읽은 내용을 response에 출력
while ((length = in.read(b)) > 0) {
os.write(b, 0, length);
}
//강제출력
os.flush();
//스트림 닫기
os.close();
in.close();
FileInputStream(파일에서 1바이트씩 읽는 스트림)
다운로드 응답을 보내기 위한 response 설정
1. response.setContentType("application/octet-stream");
octet-stream: 바이너리 파일 한 종류
setContentType(): 파일의 마임설정. 파일의 종류. 브라우저한테 "application/octet-stream"로 사용할거야.
"application/octet-stream"로 사용해줘 라는 메세지를 전달한다.
2. response.setHeader("Content-Disposition", "attachment; filename=" + fname);
//헤더 설정. 패킷의 중요 정보를 설정. 첨부파일 전송 설정
response 기본 객체가 제공하는 헤더 관련 메서드
| 메서드 | 설명 |
| addDateHeader(String name, long date) | name 헤더에 date를 추가한다. date는 1970년 1월 1일 이후 흘러간 시간을 1/1000초 단위로 나타낸다. |
| addHeader(String name, String value) | name 헤더에 value를 값으로 추가한다 |
| addIntHeader(String name, int value) | name 헤더에 정수 값 value를 추가한다. |
| setDateHeader(String name, long date) | name 헤더의 값을 value로 지정한다. date는 1970년 1월 1일 이후 흘러간 시간을 1/1000초 단위로 나타낸다. |
| setHeader(String name, String value) | name 헤더의 값을 value로 지정한다. |
| setIntHeader(String name, int value) | name 헤더의 값을 정수 값 value로 지정한다. |
| containsHeader(String name) | 이름이 name인 헤더를 포함하고 있을 경우 true를, 그렇지 않을 경우 false를 리턴한다. |
/down/list.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
<h3>파일 다운로드</h3>
<ul>
<c:forEach var = "f" items = "${flist }">
<li><a href="${pageContext.request.contextPath}/down/test?fname=${f }">${f }</a></li>
</c:forEach>
</ul>
</body>
</html>
@WebServlet("/down/list") 에서 실행




'Kosta' 카테고리의 다른 글
| CommandHandler_Day38 (0) | 2023.04.11 |
|---|---|
| DispatcherServlet / commandHandler / commands.properties_Day38 (0) | 2023.04.11 |
| 로그인(세션과 쿠키)_Day31, Day32 (0) | 2023.03.30 |
| [JAVASCRIPT]_Day25 (0) | 2023.03.22 |
| [JAVA, Oracle] 게시판 만들기_Day18 (0) | 2023.03.09 |