Notice
Recent Posts
Recent Comments
Link
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

brograming

파일 다운로드_Day38 본문

Kosta

파일 다운로드_Day38

brograming 2023. 4. 11. 10:36

c: 밑에 down이라는 파일만들기(다운받을 파일들을 저 파일에 넣어두고 페이지에 링크를 달아서 다운로드할수 있게 한다.)
파일 목록 String[] flist = dir.list(); //파일 목록 반환 {"짱구.jpg", "file.txt"};

@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") 에서 실행

down 안에 들어있는 파일들이
링크로 페이지에 나타난다.
링크를 클릭하면 다운로드완료된다.

'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