학부공부/웹시스템설계및개발

JSP를 통한 파일 업로드

IT grow. 2018. 9. 15. 00:48
반응형

JSP를 통한 파일 업로드를 알아보자.


cos.jar을 통한 파일 업로드를 할 것이고, 업로드 되는 파일의 갯수는 2개이다.


pageEncoding은 UTF-8로 맟춰주었다.


코드를 통해서 알아보자.


다음 코드는 FileuploadForm 이다.

<%@ 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>파일 업로드</title>
</head>
<body>
<center>
<form action="fileUpload.jsp" method="post"
enctype="multipart/form-data">
# action이나 어떤 파일의 전송에서 필요한 부분인데 ,
# 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>
</center>
</body>
</html>


























다음은 FileUpload.jsp


이 부분에서 실질적으로 파일을 업로드 해주는 역할을 하게 된다 .

파일 업로드를 해주기 위해서는 사전 작업이 필요하다 .

cos.jar 이라는 파일이 필요한데 ,


http://servlets.com/cos/ < -- 이 사이트를 접속하면 다운 받을 수 있다 .


다음 파일을 다운 받고 압축을 해제해 준다 .





압축을 풀고 cos.jar파일을 복사해서 내가 사용하고자 하는 프로젝트 내의 lib 폴더에 복사해서 붙여 넣기 해준다.


그러면 사전 작업은 완료되었다.





소스 코드로 돌아가 보자 .




<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="com.oreilly.servlet.MultipartRequest"%>
// 파일 업로드를 하기 위한 몇개의 Import
<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
// 파일 업로드를 하기 위한 몇개의 Import
<%@ page import="java.util.*"%>
<%
// 소스코드가 위치하는 폴더 (WebContent)에 upload 폴더를 생성
String uploadPath = request.getRealPath("Example_Fileupload/upload");
// getRealPath를 설정할 때 upload 파일의 경로를 제대로 설정해 주어야 한다.
out.print(uploadPath);
// 이 부분은 내가 설정해준 경로가 맞는지 확인차원에서 .
int size = 10 * 1024 * 1024;
// 파일의 size 설정
String name = "";
String subject = "";
String filename1 = "";
String filename2 = "";
String origfilename1 = " ";
String origfilename2 = " ";
// String으로 변수를 만들어 주는 이유는 작성자와 제목 , 파일이름 , 원래 파일이름 명을 저장시켜 주기 위해서
// 그리고 파일업로드를 시행하는 메서드는 try - catch 문으로 감싸준다.
try {
MultipartRequest multi = new MultipartRequest(request, uploadPath, size, "UTF-8",
new DefaultFileRenamePolicy());
# MultipartRequest 가 file업로드 메서드 인데 ,
# 순차적으로 request , 파일경로 , 크기 , 유형 , 파일이름 재설정
name = multi.getParameter("name");
# 작성자 이름을 가져온다.
subject = multi.getParameter("subject");
# 제목을 가져온다
Enumeration files = multi.getFileNames();
저장되어 있는 파일의 이름을 가져온다
String file1 = (String) files.nextElement();
# 직역하면 파일의 다음요소를 가르키는데 , 이것은 초기값 다음을 가져와야 한다고 한다.
filename1 = multi.getFilesystemName(file1);
# 시스템에 저장되어 있는 file이름을
origfilename1 = multi.getOriginalFileName(file1);
# 파일의 원래 이름을 가져온다.
String file2 = (String) files.nextElement();
filename2 = multi.getFilesystemName(file2);
origfilename2 = multi.getOriginalFileName(file2);
} catch (Exception e) {
e.printStackTrace();
}
%>
<!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>파일 업로드</title>
</head>
<body>
<form name="fileCheck" 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="origfilename1" value="<%=origfilename1%>">
<input type="hidden" name="origfilename2" value="<%=origfilename2%>">
<a href="#" onclick="javascript:fileCheck.submit()"> 업로드 확인 및 다운로드
페이지 이동
</form>
</body>
</html>




다음은 FileCheck.jsp


이 부분은 file이 제대로 업로드가 되었는지 확인해 주는 부분


<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("UTF-8");
// request 의 인코딩 설정
String name = request.getParameter("name");
String subject =request.getParameter("subject");
String filename1 =request.getParameter("filename1");
String filename2 =request.getParameter("filename2");
String origfilename1 =request.getParameter("origfilename1");
String origfilename2 =request.getParameter("origfilename2");
// 순차적으로 작성자와 제목 파일명 오리지널 파일명을 가져온다.
%>
<!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>파일 업로드 확인 및 다운로드</title>
</head>
<body>
올린사람 :
<%=name%><br> 제목 :
<%=subject%><br> 파일명1:
<a href="file_down.jsp?file_name=<%=filename1 %>"><%=origfilename1%></a>
// file_down 으로 file_name을 넘겨주고 , origfilename1의 값을 출력시켜준다.
<br> 파일명2:
<a href="file_down.jsp?file_name=<%=filename2 %>"><%=origfilename2%></a>
<br>
</body>
</html>




마지막으로 FileDonw.jsp





<%@ page import="java.io.*"%>
<%@ page import="java.io.File"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String fileName = request.getParameter("file_name");
// file_name의 값을 받아오는데 , 전 jsp에서 넘겨줄 것이다.
String savePath = "Example_Fileupload/upload";
// savaPath 설정 할 때 , 정확한 경로 값을 설정 할 것 , 같은 폴더 내에 존재 하더라도 폴더 / .jsp or
ServletContext context = getServletContext();
String sDownloadPath = context.getRealPath(savePath);

System.out.println("다운로드 위치 " + sDownloadPath);
// 다운로드 위치가 제대로 되어있는지 확인
String sFilePath = sDownloadPath + "\\" + fileName;
// 다운로드의 위치와 파일명이 제대로 되어 있는지 확인
byte b[] = new byte[4096];

File oFile = new File(sFilePath);
FileInputStream in = new FileInputStream(sFilePath);
String sMimeType = getServletContext().getMimeType(sFilePath);
System.out.println("유형 : " + sMimeType);
if (sMimeType == null) {
sMimeType = "application/octet-stream";
}
// octet-stram은 8비트로 된 일련의 데이터를 뜻한다.
// 지정되지 않은 파일 형식을 의미
response.setContentType(sMimeType);
// 한글 업로드 (이 부분이 한글 파일명이 깨지는 것을 방지해 준다)
String sEncoding = new String(fileName.getBytes("UTF-8"), "8859_1");
// 이 부분이 모든 파일 링크를 클릭했을 때 다운로드 화면이 출력되게
// 처리하는 부분이다.

ServletOutputStream out2 = response.getOutputStream();
int numRead;
// 바이트 배열 b의 0번부터 numRead번 까지 브라우저로 출력
while ((numRead = in.read(b, 0, b.length)) != -1) {
out2.write(b, 0, numRead);
}
out2.flush();
out2.close();
in.close();
%>
<!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>Download</title>
</head>
<body>
</body>
</html>





반응형