본문 바로가기
국비 과정/JSP

국비 - 1018 ( JSTL 파일 올리기 )

by 코딩호야 2022. 10. 18.

간단한 파일 업로드 형식 

fileuploadform.jsp  페이지

전반적인 첫번째로 보여지는 화면의 틀을 form 태그로 구상하고  파일을 전달하는 페이지이다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>File Upload 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">
<table>
	
		<tr>
			<td colspan="2" class="td_title"> 파일 업로드 폼 </td>
		<tr>
			<td><label for="name">올린 사람 : </label></td><td><input type="text" name="name" id="name"></td>
		</tr>
		<tr>
			<td><label for="subject">제목 : </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">파일명22 : </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  페이지

파일을 담을 Path 를 정해주고  MultipartRequset클래스를 이용해서 파일을 전달하는 페이지이다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.oreilly.servlet.MultipartRequest" %>
<%@ page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>
<%@ page import="java.util.*" %>

<%
	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());		/* 사진이 중복되지 않도록 숫자를 파일뒤에 붙여지게해주는 코드 */
    		/* 1번째 인자로는 무조건 request 객체를 받는다.
    		   2번째 인자는 세이브 디렉토리의 경로.
    		   3번쨰 인자는 제한 용량 설정 (int 형 1024*1024*10 => 10mb)
    		   4번째 인자는 문자 인코딩 방식
    		   5번째 인자는 리네임 정책 */
    		   
    	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 %>">	
	
	<!-- type 을 hidden 으로 준것은 파일을 숨겨서 가져가겠다는 의미이다. -->
	
	
</form>
<a href="#" onclick="javascript:filecheck.submit()"> 업로드 확인 및 다운로드 페이지 이동</a>


</body>
</html>

 

fileCheck.jsp 페이지

파일이 업로드되는지 확인하고 다운로드 받기위한 페이지

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<% 
	request.setCharacterEncoding("utf-8");
	String name=request.getParameter("name");
	String subject=request.getParameter("name");
	String filename1=request.getParameter("filename1");
	String filename2=request.getParameter("filename2");
	String origfilename1=request.getParameter("origfilename1");
	String origfilename2=request.getParameter("origfilename2");
	
%>

<html>
<head>
<meta charset="UTF-8">
<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 language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.net.URLEncoder" %>
<%@ page import="java.io.File" %>
<%@ page import="java.io.*" %>

<%
	String fileName = request.getParameter("file_name");
	
	String savePath = "upload";
	ServletContext context = getServletContext();
	String sDownloadPath = context.getRealPath(savePath);
	String sFilePath = sDownloadPath + "\\" + fileName;
	byte b[] = new byte[4096];
	FileInputStream in = new FileInputStream(sFilePath);
	String sMimeType = getServletContext().getMimeType(sFilePath);
	System.out.println("sMimeType>>>" + sMimeType);
	
	if (sMimeType == null)
		sMimeType = "application/octet-stream";
	
	response.setContentType(sMimeType);
	String agent = request.getHeader("User-Agent");
	boolean ieBrowser = (agent.indexOf("MSIE") > -1) || (agent.indexOf("Trident") > -1);
	
	if (ieBrowser) {
		fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20");
	}else {
		fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");
	}
	response.setHeader("Content-Disposition", "attachment; filename= " + fileName);
	
	ServletOutputStream out2 = response.getOutputStream();
	int numRead;
	
	while ((numRead = in.read(b, 0, b.length)) != -1){
		out2.write(b, 0, numRead);
	}
	
	in.close();
	out2.flush();
	out2.close();
%>

 

처음 화면에서  사람 , 제목 , 파일들을 전송하면  아래처럼  업로든된 파일명과 사람, 제목을 확인할 수 있다.

 

위화면에서 다운받기를 원하는 파일을 클릭하면 사진을 컴퓨터로 다운받을수 있게 된다.

 

 

이처럼  파일을 보낼수 있고 파일은 다운받을수 있는 간단한 페이지가 완성되었다.