아무튼 개발
article thumbnail
반응형

 

지난 글에선 파일을 업로드 했다면, 지금은 파일을 다운로드하는 방법을 알아보겠다

 

 

먼저 파일 다운로드를 실행시켜줄 메소드를 입력하겠다.

 

FileManager.java <파일 다운로드 메소드>

파일을 다운로드해주는 메소드를 입력하는 파일이다.

클라이언트가 서버에 데이터를 보낼 때는 Request,

서버가 클라이언트에게 보낼 때는 Response이다.

public static boolean doFileDownload(HttpServletResponse response, String saveFileName, String originalFileName, String path) {

		try {			
			String filePath = path + File.separator + saveFileName;
			
			if(originalFileName==null||originalFileName.equals("")) {
				originalFileName = saveFileName;
			}
			
			originalFileName = new String(originalFileName.getBytes("euc-kr"),"ISO-8859-1"); 
			File f = new File(filePath);
			
			if(!f.exists()) {
				return false; 
			}

파일을 다운받는 것은 서버가 클라이언트에게 보내는 것이기에 response를 입력해주며 그 외의 파일 정보를 입력한다.

 

filePath는 파일의 경로를 입력해주는 것이다.

지난 글에서 봤던 path에 이어 파일명까지 추가로 입력해주어 실제 파일 경로를 나타낸다.

 

if문을 입력하여 검증을 먼저 거친다.

 

그 다음 getBytes을 통해 클라이언트 컴퓨터에 저장할 때 한글 파일명의 깨짐을 방지하도록 originalFileName을 설정해준다. ISO-8859-1은 8859_1로 생략해줄 수 있다.

파일 객체를 생성하여 경로를 입력해주며

파일이 존재하지 않을 시에는 boolean이므로 false를 반환해준다.

 

			response.setContentType("application/octet-stream");
			response.setHeader("Content-disposition", "attachment;fileName=" + originalFileName);
			
			BufferedInputStream bis = new BufferedInputStream(new FileInputStream(f));			
			OutputStream out = response.getOutputStream(); 
			
			int data;
			byte[] bytes = new byte[4096];
			while((data=bis.read(bytes, 0, 4096))!=-1) {
				out.write(bytes,0,data); 
			}
			
			out.flush();
			out.close();
			bis.close();
			
		} catch (Exception e) {
			System.out.println(e.toString());
			return false; 
		}
		return true;
	}

실제로 파일을 다운받는 코딩이다.

 

setContentType에서 octet은 예를 들어 abc.txt의 '.'을 의미한다. 즉, '.'으로 구분된 파일들을 의미한다.

setHeader로 파일의 다운로드가 되는 것을 뜨게 하고 파일명을 알려준다.

 

BufferedInputStream으로 파일을 읽어내며

OutputStream로 파일을 받는다.

 

while문으로 byte를 0에서부터 data가 있는 만큼 내보내도록 한다.

마지막으로 flush처리와 함께 모두 닫아주면 된다.

 

catch문은 에러가 났을 경우이기 때문에, false 반환값을 입력해주고

catch문 바깥에 true값을 입력해주면 된다.

 

 

list.jsp <화면 구현>

웹페이지에 보여줄 list 파일 화면이며

테이블을 생성하여 그 안에 해당 부분을 누르면 하이퍼링크를 통해 downloadPath로 연결되도록 하였다.

 

<td align="left" width="250">
	<a href="${downloadPath }?num=${dto.num}">${dto.originalFileName }</a>
</td>

그럼 downloadPath를 입력한 곳을 알아보겠다.

 

 

FileTestServlet.java <서블릿>
if(uri.indexOf("list.do")!=-1) {

String downloadPath = cp + "/file/download.do";
req.setAttribute("downloadPath", downloadPath);	
        
url = "/fileTest/list.jsp";
forward(req, resp, url);
}

downloadPath 값은 download.do로 가도록 설정했으며 이 역시 밑에서 코딩으로 연결해주었다.

데이터가 forward를 통해 넘어갈 수 있도록 setAttribute에 값을 넣어주었다.

 

}else if(uri.indexOf("download.do")!=-1) {			
			int num = Integer.parseInt(req.getParameter("num"));			
			FileTestDTO dto = dao.getReadData(num);
			
			if(dto==null)
				return;
			
			boolean flag = FileManager.doFileDownload(resp, dto.getSaveFileName(), dto.getOriginalFileName(), path);
			
			if(flag==false) {
				resp.setContentType("text/html;charset=utf-8");
				
				PrintWriter out = resp.getWriter();
				out.print("<script type='text/javascript'>");
				out.print("alert('Download Error!!');");
				out.print("history.back();");
				out.print("</script>");
			}			
		}

 

downloadPath 에 담긴 주소인 download.do의 코딩이다.

 

num을 기준으로 찾아 데이터를 가져왔으며 if문에서 데이터가 없을 시 종료하도록 검증하였다.

 

flag로 위에서 본 파일 다운로드 메소드를 호출하였고

false일 경우 alert로 다운로드 에러창을 띄운 다음

history.back()으로 다시 뒤돌아가는 코딩을 실행하였다.

 

 


이렇게 해서 파일 다운로드하는 코딩을 알아보았다.

 

 

2월 24일 수업🌓
반응형
profile

아무튼 개발

@릴쥬

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...