티스토리 뷰

정리 노트/JSP

9주차-4일

eyoadgkn 2023. 12. 7. 13:07

파일업로드
파일업로드

파일업로드는 웹브라우저에서 서버로 파일을 전송하여 서버에 저장을 하는 것을 말합니다. 이때 가능한 업로드 파일은 텍스트, 바이너리, 이미지, 문서 등의 유형이 있습니다. 이때 전송을 할려면 폼태그를 사용하여야 하며 서버에 저장을 할려면 오픈 라이브러리를 이용하여야 합니다.

파일 업로드를 위한 폼태그는 반드시 method속성을 post로 하여야 하고, enctype는 multipart/form-data로 설정을 하여야합니다. 하위로 input박스의 type 속성은 file로 지정을 해줍니다.

<form action="jsp파일" method="post" enctype="multipart/form-data">
       <input type="file" name="요청 파라미터 이름">
</form>

파일 업로드를 처리하는 방법으로는 multipartRequest를 이용하거나 아파치의 API를 이용하여 처리를 합니다.

MultipartRequest를 이용한 파일 업로드

MultipartRequest는 웹 페이지에서 서버로 업로드 되는 파일 자체만 다루는 클래스입니다. 해당 데이터의 방식들을 분석한 뒤 데이터의 구분을 해주고 파일 데이터에 접근을 합니다. 

MultipartRequest 클래스를 생성하는 방법은 생성자에 전달 값을 request, saveDirectory, maxPostSize, encoding, policy 를 넣어 준 뒤 생성을 해줍니다.
request - 내장 객체를 설정, saveDirectory - 상대 저장경로 설정, maxPostSize - 파일의 최대 크기 설정, encoding - 인코딩 유형을 설정, policy - 객체로써 같은 이름의 파일이 있다면 변경을 도와주는 클래스입니다. MultipartRequest의 메서드는 웹브라우저에서 전송한 데이터나 파일을 쉽게 읽고, 업로드를 할 수 있도록 도와줍니다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<!-- form태그에 method를 post로 enctype을 multipart/form-data로 설정 -->
	<form name="fileForm" method="post" enctype="multipart/form-data" 
	action="fileupload01_process.jsp">
		<p> 이 름 : <input type="text" name="name">
		<p> 제 목 : <input type="text" name="subject">
		<!-- type을 file로 하여 파일업로드하게끔 설정  -->
		<p> 파 일 : <input type="file" name="filename">
		<p> <input type="submit" value="파일 올리기">
	</form>
	<!-- submit버튼을 통해 해당 액션페이지로 이동되면서 -->
	<!-- 해당 값들을 request에 넣고 이동을 한다. -->
</body>
</html>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page import="com.oreilly.servlet.*" %>
    <%@ page import="com.oreilly.servlet.multipart.*" %>
    <%@ page import="java.util.*" %>
    <%@ page import="java.io.*" %>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		/* img 디렉토리에 대한 실제 파일 경로를 찾고, 그 경로를 문자열로 출력해  */
		/* 그 경로를 save에 저장한다. */
		String save = request.getServletContext().getRealPath("/img");
		System.out.println(save);
		MultipartRequest multi = new MultipartRequest(request, 
				/* 해당 경로를 save로 저장. */
				save,
				/* 파일 최대 크기 */
				5*1024*1024,
				/* 인코딩 유형 설정 */
				"utf-8",
				/* policy 설정 */
				new DefaultFileRenamePolicy());
		/* 자동 */
		/* MR에서 getNames 한 것들을 params에 담는다(keys) */
		Enumeration params = multi.getParameterNames();
		
		/* while문을 통해 keys 받아 넣기 */
		/* hasMoreElements() - 해당 다음 값의 유무의 판단 */
		/* hasElement() - 다음의 값을 반환시킨다. */
		while(params.hasMoreElements())
		{
			String name = (String) params.nextElement();
			String value = multi.getParameter(name);
			out.println(name+" = "+value+"<br>");
		}
		
		out.println("--------------------------<br>"); 
		
		/* MR에서 getNames 한 것들을 params에 담는다(keys) */
		Enumeration files = multi.getFileNames();
		
  		while(files.hasMoreElements())
		{
			String name = (String) files.nextElement();
			/* 저장 후 이름  */
			String filename =  multi.getFilesystemName(name);
			/* 저장 전 이름 */
			String original = multi.getOriginalFileName(name);
			String type =  multi.getContentType(name);
			File file = multi.getFile(name);
			
			out.println("요청 파라미터 이름 : " + name + "<br>");
			out.println("실제 파일 이름  : " + original + "<br>");
			out.println("저장 파일 이름 : " + filename + "<br>");
			out.println("파일 콘텐츠 유형 : " + type + "<br>");
			out.println("<img src=../img/" + filename + ">"); 
			
			if(file != null)
			{
				/* 파일의 length()는 해당 파일의 크기나 size를 반환해준다. */
				out.println(" 파일 크기 : " + file.length());
				out.println("<br>");
			}
		} 
		/* response.sendRedirect("out.html"); */
	%>
</body>
</html>
<body>
	<h1>결과값전송</h1>
	

</body>

<body>
	<form action="fileupload02_process.jsp" method="post" enctype="multipart/form-data">
		<p> 이 름 : <input type="text" name="name1">
			제 목 : <input type="text" name="subject1">
			파 일 : <input type="file" name="filename1">
		<p> 이 름 : <input type="text" name="name2">
			제 목 : <input type="text" name="subject2">
			파 일 : <input type="file" name="filename2">
		<p> 이 름 : <input type="text" name="name3">
			제 목 : <input type="text" name="subject3">
			파 일 : <input type="file" name="filename3">
		<p> <input type="submit" value="파일 올리기">	
	</form>
</body>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
        <%@ page import="com.oreilly.servlet.*" %>
    <%@ page import="com.oreilly.servlet.multipart.*" %>
    <%@ page import="java.util.*" %>
    <%@ page import="java.io.*" %>
    <%@page import="com.oreilly.servlet.MultipartRequest"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		MultipartRequest multi = new MultipartRequest(request,
				"C:\\upload",
				5*1024*1024,
				"utf-8",
				new DefaultFileRenamePolicy());
	
		String name1 = multi.getParameter("name1");
		String subject1 = multi.getParameter("subject1");
		
		String name2 = multi.getParameter("name2");
		String subject2 = multi.getParameter("subject2");
		
		String name3 = multi.getParameter("name3");
		String subject3 = multi.getParameter("subject3");
		
		Enumeration files = multi.getFileNames();
		/* Enumeration을 사용하고나서는 while을 사용해주는 것이 좋다. */
		
		String file3 = (String) files.nextElement();
		String filename3 = multi.getFilesystemName(file3);
		
		String file2 = (String) files.nextElement();
		String filename2 = multi.getFilesystemName(file2);
		
		String file1 = (String) files.nextElement();
		String filename1 = multi.getFilesystemName(file1);

			
	%>
	<table border="1">
		<tr>
			<th width="100">이름</th>
			<th width="100">제목</th>
			<th width="100">파일</th>
		</tr>
		<%
			out.print("<tr><td>"+name1+"</td>");
			out.print("<td>"+subject1+"</td>");
			out.print("<td>"+filename1+"</td></tr>\n");
			
			out.print("<tr><td>"+name2+"</td>");
			out.print("<td>"+subject2+"</td>");
			out.print("<td>"+filename2+"</td></tr>\n");
			
			out.print("<tr><td>"+name3+"</td>");
			out.print("<td>"+subject3+"</td>");
			out.print("<td>"+filename3+"</td></tr>\n");
			
		%>
	</table>	
</body>

 

'정리 노트 > JSP' 카테고리의 다른 글

10주차-1일  (0) 2023.12.11
9주차-5일  (0) 2023.12.08
9주차-3일  (0) 2023.12.06
9주차-2일  (0) 2023.12.05
9주차-1일  (0) 2023.12.04
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함