JSP 파일업로드

2017. 4. 21. 18:59JSP

 파일업로드를 하기 위해서는 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