fileUploadForm.jsp : End유저의 입력을 받고 서버로 데이터를 전소앟때 데이터(byte)묶음이 어떤 타입(MIME,enctype)인지를 함께 서버측 역할인 fileUpload.jsp로 보냄
fileUpload.jsp : cos.jar 라이브러리르 사욯하여 요청받은 데이터를 분석하여 파일 정보(파일이름, 사용자 입력 문자열 데이터)를 보여준다. 파일데이터는 cos.jar의 MultipartRequest로 임시저장.
filecheck.jsp : end유저가 업로드한 파일의 정보를 input type hidden 으로 받아서 다운로드가 가능하게끔 하는 view페이지
filedown.jsp : (서버입장에서) 다운로드 시킬 파일의 서버 내부 위치 설정 Client에게 보내는 response의 내용을 response Header를조작하여 브라우저 다운로드가 가능하도록 변경 MS IE일 경우 대응
fileUploadForm.jsp소스코드
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>FileUpload Form</title>
<style>
#uploadFormArea{
margin: auto;
width: 350px;
border: 1px solid black;
}
.td_title {
font-size: xx-large;
text-align: center;
}
</style>
</head>
<body>
<section id = "uploadFormArea">
<form action="fileUpload.jsp" method="post" enctype="multipart/form-data"> <!-- enctype : MIME TYPE -->
<table>
<tr>
<td colspan="2" class="td_title">파일 업로드 폼</td>
</tr>
<tr>
<td><label for="name">올린 사람 :</label></td>
<td><input type="text" name="name" id="name"/></td>
</tr>
<tr>
<td><label for="name">제목 :</label></td>
<td><input type="text" name="subject" id="subject"/></td>
</tr>
<tr>
<td><label for="fileName1">파일명1 :</label></td>
<td><input type="file" name="fileName1" id="fileName1"/></td>
</tr>
<tr>
<td><label for="fileName2">파일명2 :</label></td>
<td><input type="file" name="fileName2" id="fileName2"/></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="전송"></td>
</tr>
</table>
</form>
</section>
</body>
</html>
실행결과
fileUpload.jsp 소스코드
<%@ page import="com.oreilly.servlet.MultipartRequest" %>
<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>
<%@ page import="java.util.Enumeration" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String uploadPath = request.getRealPath("/upload");
int size = 10*1024*1024;
String name = "";
String subject = "";
String filename1 = "";
String filename2 = "";
String origfilename1 = "";
String origfilename2 = "";
try{
MultipartRequest multi= new MultipartRequest(request,
uploadPath,
size,
"UTF-8",
new DefaultFileRenamePolicy());
name = multi.getParameter("name");
subject = multi.getParameter("subject");
Enumeration files = multi.getFileNames();
String file1 = (String) files.nextElement();
filename1 = multi.getFilesystemName(file1);
origfilename1 = multi.getOriginalFileName(file1);
String file2 = (String) files.nextElement();
filename2 = multi.getFilesystemName(file2);
origfilename2 = multi.getOriginalFileName(file2);
}catch (Exception e){
e.printStackTrace();
}
%>
<html>
<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%>">
</form>
<a href="#" onclick="javacript:filecheck.submit()">업로드 확인 및 다운로드 페이지 이동</a>
</body>
</html>
실행결과
fileCheck.jsp 소스코드
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
String subject = request.getParameter("subject");
String filename1 = request.getParameter("filename1");
System.out.println("filename1" + filename1);
String filename2 = request.getParameter("filename2");
String origfilename1 = request.getParameter("origfilename1");
String origfilename2 = request.getParameter("origfilename2");
%>
<html>
<head>
<title>파일 업로드 확인 및 다운로드</title>
</head>
<body>
올린 사람: <%= name%><br/>
제목: <%= subject%><br/>
파일명1: <a href="file_down.jsp?file_name=<%= filename1%>"><%=origfilename1%></a><br/>
파일명2: <a href="file_down.jsp?file_name=<%= filename2%>"><%=origfilename2%></a><br/>
</body>
</html>
실행결과
file_down.jsp 소스코드
<%@ page import="java.io.FileInputStream" %>
<%@ page import="java.net.URLEncoder" %>
<%@ page import="java.nio.charset.StandardCharsets" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String fileName = request.getParameter("file_name");
String savePath = "upload";
ServletContext context = config.getServletContext();
String sDownloadPath = context.getRealPath(savePath);
String sFilePath = sDownloadPath + "\\" + fileName;
byte[] b = new byte[4096];
String sMimeType = config.getServletContext().getMimeType(sFilePath);
System.out.println("sMimeType>>>>>>>>" + sMimeType);
if(sMimeType == null){
sMimeType = "application/octet-stream";
}
// Microsoft Internet Explorer로 받은 요청인지 아닌지?
String agent = request.getHeader("User-Agent");
boolean ieBrowser = (agent.contains("MSIE")) || (agent.contains("Trident"));
// Microsoft Internet Explorer라면 파일 이름을 어떻게 처리해서 보낼것인지?
if(ieBrowser) {
fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
} else {
fileName = new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);
}
/*
* client가 받을 response header의 내용을 일부 변경.
* */
response.setContentType(sMimeType);
response.setHeader("Content-Disposition", "attachment; filename= " + fileName);
// 저장된 파일을 메모리로 불러온다.
FileInputStream in = new FileInputStream(sFilePath);
// enduser로 보낼 파일 데이터(바이트배열)를 준비
ServletOutputStream out2 = response.getOutputStream();
int numRead;
// outputstream에 데이터를 실어서
while((numRead = in.read(b, 0, b.length)) != -1) {
out2.write(b, 0, numRead);
}
// client에게 보낸다.
out2.flush();
out2.close();
in.close();
%>
<html>
<head>
<title>Title</title>
</head>
<body>
</body>
</html>
실행결과
왼쪽 하단에 2개의 PNG파일 다운로드 실행창이 생겼다.
'jsp' 카테고리의 다른 글
게시판 만들기 (구조 및 구현) 임시저장 (0) | 2021.08.26 |
---|---|
JSTL 태그용어 및 (for each,if문 예시) (0) | 2021.08.25 |
Jsp- 세션,쿠키 예제(CookieExample1.jsp) (0) | 2021.08.18 |
Jsp (세션,쿠키) (0) | 2021.08.18 |
Jsp 프로그래밍 (0) | 2021.08.17 |