[ITWILL : JSP]Javabean 13 : 게시판만들기(파일다운로드)

ITWILL학원 : 31강 JSP기초 BY 정규태강사

이 부분은 어렵다. 반복해서 보자.

1. up.jsp에 onclick이벤트 연결

  • onclick에 function을 넣어도 되고 location.href넣어도 둘 다 동일한 결과 출력된다.
    • input type=”button” value=”파일삭제” onclick=”downfile()”
    • input type=”button” value=”파일삭제” onclick=”location.href=’./down.jsp’”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<fieldset>
<form method="post" name="myform">
<input type="text" name="filename" value="<%=fileName%>">
<input type="button" value="파일삭제" onclick="delfile()">
<input type="button" value="파일다운로드" onclick="downfile()">
</form>
</fieldset>

<script type="text/javascript">
function delfile(){
document.myform.action="./delup.jsp"; //myform이름의 폼태그의 action값을 설정
document.myform.submit();
}

function downfile(){
document.myform.action="./down.jsp"; //myform이름의 폼태그의 action값을 설정
document.myform.submit();
}
</script>

2. down.jsp생성

  1. 인코딩

    • 모든 UTF-8을 EUC-KR(euc-kr)로 변경해준다. 대소문자 둘 다 가능.
    • string은 그냥 담아도 되고 객체에 담아도 된다. 즉 1번과 2번이 동일 WHY? String의 특징!
    • 1번 : String filename=request.getParameter(“filename”)
    • 2번 : String filename= new String(request.getParameter(“filename”));
  2. java.io 아래에 있는 입출력 객체를 import한다

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<%@page import="java.io.FileNotFoundException"%>
<%@page import="java.io.FileInputStream"%>
<%@page import="java.io.File"%>
<%@page import="java.io.OutputStream"%>
<%@page import="java.io.InputStream"%>
<%@ page language="java" contentType="text/html; charset=euc-kr"
pageEncoding="euc-kr"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title>Insert title here</title>
</head>
<body>
<h2>다운로드페이지</h2>
<%
//1. 인코딩
//string은 그냥 담아도 (=String filename=request.getParameter("filename"))되고 객체에 담아도된다
//String filename= new String(request.getParameter("filename"));
//파라미터 데이터를 가져와서 8859_1 인코딩방식으로 바꾼 뒤 EUC-KR로 한번 더 바꾸는 것
String filename = new String((request.getParameter("filename")).getBytes("8859_1"),"euc-kr");

//2. 파일저장경로(절대경로)
String filePath = "D:/upfile";

//3. 입출력시 필요한 객체 생성
InputStream in = null;
OutputStream os = null;
File file = null;
File viewFile = null;

//3-1. 추가 레퍼런스생성
boolean skip = false; //플래그만들기
String client = "";

// 4. 예외처리
try{
//5. 변수생성 : 인코딩시 변경되는 string 따로 저장하려고 3개 변수 만듬
String fname1 = "";
String fname2 = "";
String fname = "";

fname = filename;
fname1 = new String(fname.getBytes("8859_1"), "euc-kr");
//9. try catch구문으로 묶기
try{
//6. 전달된 파일 경로,이름 사용해서 파일 객체 생성
file = new File(filePath, fname);
viewFile = new File(filePath,fname1);

//확인차 페이지에 출력
out.print("file : "+file+"<br>");
out.print("viewfile : "+viewFile);

//8. 파일을 읽어오기 위해서 입력 통로를 생성
// 객체를 만든 순간 = 해당 폴더로 이동해서 파일을 선택한 상황임.
// InputStream in = null;
in = new FileInputStream(file); //업캐스팅
}catch(FileNotFoundException e){
skip = true;
}

//10. String변수만들어주기
fname2 = new String(fname1.getBytes("euc-kr"), "8859_1");

//11. 응답객체초기화 for 다운로드 팝업창 생성된 것처럼 보이게끔하여 다운로드 진행중임을 표시
response.reset();

2-1. down.jsp에 다운로드기능 구현 코드

다운로드 기능을 구현하고자한다. 위의 코드에 이어서 작성해보자

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
	//12. 다운로드처리
//12-1. 클라이언트가 다운로드 요청시 사용자 웹브라우저 정보필요
//why? 브라우저별로 설정해줘야하는 것들이 다르기 때문
client = request.getHeader("User-Agent");
//System.out.println("client :" + client);
//12-2. 사용자브라우저에 따른 처리
//12-2-1. mine 타입이용하여 값세팅하기
response.setContentType("application/x-msdownload");
response.setHeader("Content-Description", "JS Generated Data");
//12-2-2. 브라우저마자 실행 제어
if(!skip){ //false항상실행
if(client.indexOf("MSIE 5.5") != -1){
response.setHeader("Content-Type", "doesn/matter; charset=euc-kr");
response.setHeader("Content-Disposition", "filename"+ new String(fname.getBytes("euc-kr"),"8859_1"));
}else{
response.setHeader("Content-Type", "application/octet-stream; charset=euc-kr");
response.setHeader("Content-Disposition", "attachment; filename="+new String(fname.getBytes("euc-kr"),"8859_1"));
}
//12-2-3. 문자열만들기
response.setHeader("Content-Transfer-Encoding", "binary;");
response.setHeader("Content-Length", ""+file.length());
response.setHeader("Pragma", "no-cache;");
response.setHeader("Expires", "-1;");

//12-3. 데이터출력할 수 있는 통로 생성
os = response.getOutputStream();

//12-3-1. 바이트스트림
byte[] b = new byte[4096];
int leng = 0;

//12-3-2. 파일을 읽어서 leng에 저장이 될 것이고 데이터가 있을 경우에만 진행
//leng은 데이터가 없으면 -1값을가진다
while((leng = in.read(b))> 0){
//데이터출력(다운로드)
os.write(b,0,leng);
}
}else{
out.print("파일다운로드 실패");
return;
}

}catch(Exception e){
System.out.println("다운로드도중 에러발생");
e.printStackTrace();
}finally{
if(in != null) in.close();
if(os != null) os.close();
}

%>