2017. 4. 21. 18:59ㆍJSP
파일업로드를 하기 위해서는 cos.jar 다운로드 및 복사 / 붙여넣기 필수
1) www.servlets.com
2) com.oreilly.servlet
3) cos-26Dec2008.zip -> 압축해제 -> lib 폴더에서 cos.jar복사
-> WEB-INF/lib 폴더에 붙여넣기
* cos.jar에는 MultipartRequest라는 클래스가 들어있다.
* MultipartRequest의 생성자를 이용해서 각종 설정을 해놓으면 파라미터를 수신해서 업로드에 활용할 수 있다.
* MultipartRequest 생성자(1,2,3,4,5)
1: request 대입
2: 업로드할 경로
3: 한번에 업로드 가능한 용량(메모리)
4: 제목, 인코딩시킬때 값(UTF-8)
5: 중복 이름 정책
* 메서드
getParameterNames(); 속성들의 이름을 모두 가져온다
getParamterValues(); 속성들의 값을 모두 가져온다
getParamter();
getFileNames(); 파일들의 이름을 모두 가져온다
getFileSystemNames(); << 파일명이중복되면 시스템에서 자동으로 바꿔주는데 그 이름임
getOriginalFileName(); << 하지만 원래 이름도 같이 가지고 있음
getFile();
[ fileUploadForm.jsp ]
<body>
<form action="fileUpload.jsp" method="post" enctype="multipart/form-data">
<table border="1">
<tr>
<td colspan="2" align="center">
<h3>파일 업로드 폼</h3>
</td>
</tr>
<tr>
<td>올린 사람</td>
<td><input type="text" name="name"/></td>
</tr>
<tr>
<td>제목</td>
<td><input type="text" name="subject"/></td>
</tr>
<tr>
<td>파일명 1</td>
<td><input type="file" name="fileName1"/></td>
</tr>
<tr>
<td>파일명 2</td>
<td><input type="file" name="fileName2"/></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="전송"/>
</td>
</tr>
</table>
</form>
</body>
출력결과
[ fileUpload.jsp ]
<body>
<%
String encType="UTF-8";
int maxSize = 1024 * 1024 * 5;
realFolder = getServletContext().getRealPath("upload");
// 톰켓상의 경로에 upload폴더에 대한 실제 경로를 알려준다
out.println( "upload폴더의 서버상 주소 : " + realFolder + "<br/>"); //입력 확인
MultipartRequest multi =
new MultipartRequest( request, realFolder, maxSize, encType, new DefaultFileRenamePolicy() );
// => 해당 경로에 파일이 업로드 완료됨 !
Enumeration en = multi.getParameterNames();
while( en.hasMoreElements() ){ // 파라미터 이름 검색
String name = (String)en.nextElement(); // 요소 추출
String value = multi.getParameter(name);
out.println(name + " : " + value + "<br/>" ); // 요소 출력 -> name과 subject 출력
}
out.println("<hr/>");
en = multi.getFileNames(); // 파일 이름 검색
while ( en.hasMoreElements() ){
String name = (String)en.nextElement();
String systemName = multi.getFilesystemName(name); // 파일이 중복되었을 때 변경된 이름
String originalName = multi.getOriginalFileName(name); // 파일의 원래 이름
String mimeType = multi.getContentType(name); // 파일의 타입
File file = multi.getFile(name); // 파일 객체
out.println(name + " : " + systemName +" " + mimeType + " " + file.length() + "bytes<br>")
}
%>
</body>
</html>
출력결과
실행 결과
=> upload의 실제경로에 파일이 추가되는 것을 확인 할 수 있다.
==============================
[ FileUploadForm.jsp ]
...
<body>
<form action="fileUpload.jsp" method="post" enctype="multipart/form-data">
<table border="1">
<tr>
<td colspan="2" align="center">
<h3>파일 업로드 폼</h3>
</td>
</tr>
<tr>
<td>올린 사람</td>
<td><input type="text" name="name"/></td>
</tr>
<tr>
<td>제목</td>
<td><input type="text" name="subject"/></td>
</tr>
<tr>
<td>파일명 1</td>
<td><input type="file" name="fileName1"/></td>
</tr>
<tr>
<td>파일명 2</td>
<td><input type="file" name="fileName2"/></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="전송"/>
</td>
</tr>
</table>
</form>
</body>
</html>
출력 결과
[ fileUpload.jsp ]
...
<body>
<%
String uploadpath = getServletContext().getRealPath("/upload");
out.println("업로드 서버 위치 : " + uploadPath );
int size = 1024*1024*5;
String name="";
String subject="";
String fileName1 = "";
String fileName2 = "";
String originalName1="";
String originalName2="";
try{
MultipartRequest multi = new MultipartRequest(
request, uploadPath, size, "utf-8", new DefaultFileRenamePolicy() );
// 파라미터 값
name = multi.getParameter("name");
subject = multi.getParameter("subject");
Enumeration en = multi.getFileNames();
// #1번째 파일
String file1 = (String)en.nextElement();
fileName1 = multi.getFilesystemName(file1);
originalName1 = multi.getOriginalFileName(file1);
// #2번째 파일
String file2 = (String)en.nextElement();
fileName2 = multi.getFilesystemName(file2);
originalName2 = multi.getOriginalFileName(file2);
}catch(Exception e){
out.println("파일 경로가 잘못 되었습니다.");
}
%>
<form action="fileCheck.jsp" method="post">
<input type="hidden" name="name" value="<%=name %>" />
<input type="hidden" name="subject" value="<%=subject %>" />
<input type="hidden" name="fileName1" value="<%=fileName1 %>" /> // 중복됬을때 파일이름
<input type="hidden" name="fileName2" value="<%=fileName2 %>" />
<input type="hidden" name="originalName1" value="<%=originalName1 %>" /> //파일원래이름
<input type="hidden" name="originalName2" value="<%=originalName2 %>" />
</form>
<a href="#" onclick="javascript:fileCheck.submit()" >업로드확인 및 다운로드 하기</a>
</body>
</html>
출력 결과
[ fileCheck.jsp ]
<%@ page ... %>
<%
request.setCharcterEncoding("UTF-8");
String name = request.getParameter("name");
String subject = request.getParameter("subject");
String fileName1 = request.getParameter("fileName1");
String fileName2 = request.getParameter("fileName2");
String originalName1 = request.getParameter("originalName1");
String originalName2 = request.getParameter("originalName2");
%>
...
<body>
업로드 확인 및 다운로드
올린 사람 : <%=name%>
제목 : <%=subject%>
파일명 1 : <a href="FileDown.jsp?file_name=<%=fileName1%>">
<%=originalName1%>
</a>
파일명 2 : <a href="FileDown.jsp?file_name=<%=fileName2%>">
<%=originalName2%>
</a>
</body>
</html>
출력 결과
[ FileDown.jsp ]
<%@page import="java.io.FileInputStream"%>
<%@page import="java.net.URLEncoder"%>
<%@page import="com.sun.org.apache.bcel.internal.generic.GETSTATIC"%>
<%@page import="java.io.File"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 클릭해서 넘어온 파일이름을 FileStream등으로 읽어온다
이때 upload폴더에 찾아가야한다
제목 등이 한글이면 깨질 수 있기 때문에 한글 인코딩도 적용해야한다
파일의 정체 ( 유형 = MIME ) 도 파악해야한다
-->
<%
String fileName = request.getParameter("file_name");
String savePath = "upload";
String sDownloadPath = getServletContext().getRealPath(savePath);
out.println(sDownloadPath+"\"+fileName); // 파일의 경로
String sFilePath = sDownloadPath+"\\"+fileName;
/* 스트림으로 읽어오자
#1. 배열에 담아놓자
#2. 배열의 크기는 최대업로드 용량을 넘지 않는다
*/
byte b[] = new byte[5*1024*1024];
// 파일 경로가 문자열로 되어있으므로, 그 문자열을 실제 경로로 파싱하자
File f = new File(sFilePath);
FileInputStream in = new FileInputStream(f);
//FileInputStream in = new FileInputStream(sFilePath);
// sFilePath를 주고 그 파일의 유형 파악
String sMimeType = getServletContext().getMimeType(sFilePath);
out.println( "파일의 유형 :" + sMimeType);
// 혹시 sMimeType이 알려져있지 않거나 알수 없는 파일일경우 -> 일괄처리하자
if( sMimeType == null ){
sMimeType = "application/octet-stream"; // 응용프로그램이다 . 8비트 단위로 해석한다
}
// 본격적으로 페이지를 만들어서 사용하자
response.setContentType(sMimeType);
// 제목이 깨질 수 있으니까, encoding타입을 정한다
// 제목을 깨지지 않게 euc-kr 방식으로 일단 읽어온다
String encTitle = new String(fileName.getBytes("euc-kr"),"8859_1");
// euc-kr 로 읽어온 제목을 utf-8로 인코딩 시킨다
String sEncoding = URLEncoder.encode(encTitle,"utf-8");
// ------- 클라이언트 바디에 알려줄 정보가 있다 ------- 다운로드내역을 화면에 보여주면 된다
// 이 설정 정보를 response할 때 헤더에 실어 놓자
response.setHeader("Content-Disposition", "attachment; filename="+sEncoding);
//화면에 쓰자 PrintWriter out = response.getWriter(); out.println();
// 스트림을 통해서 읽어와야한다.
ServletOutputStream out2 = response.getOutputStream();
// 배열의 0번부터 끝까지 read를 해놓고 out2를 통해서 0번부터 끝까지 브라우저에 출력한다
int numRead = 0 ;
while ( ( numRead = in.read(b,0,b.length) ) !=-1 ){
// b배열에서 첫번째 요소를 꺼내서 쓰면된다
out2.write(b,0,numRead);
}
out2.flush();
out2.close();
in.close();
%>
</body>
</html>
'JSP' 카테고리의 다른 글
JSP MVC1 모델 구성 (0) | 2017.04.28 |
---|---|
JSP MVC1 모델 DBCP연동하기 (0) | 2017.04.24 |
jstl ( Jsp Standard Tag Library ) (0) | 2017.04.21 |
JSP EL (0) | 2017.04.20 |
JSP액션태그 useBean (0) | 2017.04.15 |