JSP

JSP 웹 프로그래밍 - 파일 업로드

록's 2023. 3. 2. 16:19
728x90
반응형

파일 업로드의 개요

 

파일 업로드(file upload)

  • 웹 브라우저에서 서버로 파일을 전송하여 서버에 저장하는 것
  • 서버로 업로드할 수 있는 파일
    • 텍스트 파일, 바이너리 파일, 이미지 파일, 문서 등 다양한 유형이 있음
  • 웹 브라우저에서 서버로 파일을 전송하기 위해J SP 페이지에 폼 태그 사용
  • 전송된 파일을 서버에 저장하기 위해 오픈 라이브러리 이용

 

 

 

파일 업로드를 위한 JSP 페이지

  • 웹 브라우저에서 서버로 파일을 전송하기 위해 JSP 페이지에 폼 태그를 작성할 때 몇 가지 중요한 규칙
 
  • form 태그의 method 속성은 반드시 POST 방식으로 설정
  • form 태그의 enctype 속성은 반드시 multipart/form-data로 설정
  • form 태그의 action 속성은 파일 업로드를 처리할 JSP 파일로 설정
  • 파일 업로드를 위해 input 태그의 type 속성을 file로 설정
    • 만약 여러 파일을 업로드하려면 2개 이상의 input 태그를 사용하고 name 속성에 서로 다른 값을 설정

 

 

 

 

 

파일 업로드 처리 방법

  • 단순한 자바 코드로 작성하여 처리할 수 없어  오픈 라이브러리인 cos.jar나 commonsfileupload.jar를 사용해야 함
 

파일 업로드 처리 방법

 

 

 

 

 

MultipartRequest를 이용한 파일 업로드

 

MultipartRequest

  • 웹 페이지에서 서버로 업로드되는 파일 자체만 다루는 클래스
  • 웹 브라우저가 전송한 multipart/form-data 유형과 POST 방식의 요청 파라미터 등을 분석한 후 일반 데이터와 파일 데이터를 구분하여 파일 데이터에 접근
  • 한글 인코딩 값을 얻기 쉽고, 서버의 파일 저장 폴더에 동일한 파일명이 있으면 파일명을 자동으로 변경
  • 오픈 라이브러리 cos.jar를 배포 사이트에서 직접 다운로드해서 사용
    • 배포 사이트: http://www.servlets.com/cos/
    • 다운로드 파일: cos-26Dec2008.zip
    • JSP 페이지에 page 디렉티브 태그의 import 속성을 사용하여 패키지 com.oreilly.servlet.*을 설정

 

 

 

 

MultipartRequest 클래스 생성

 

 

MultipartRequest 생성자의 매개변수

 

 

 

 

MultipartRequest 메소드

  • 웹 브라우저에서 전송되는 요청 파라미터 중
    • 일반 데이터는 getParameter( ) 메소드로 값을 받음
    • 파일의 경우 getFileNames( ) 메소드를 이용하여 데이터를 받음

 

 

 

MultipartRequest 메소드의 종류

 

 

 

 

 

 

MultipartRequest 클래스를 이용하여 파일 업로드 및 정보 출력

  • 오픈 라이브러리 cos.jar 파일을 다운로드하여 /WebContent/WEB-INF/lib/ 폴더에 추가
// fileupload01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>file upload</title>
</head>
<body>
	<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">
		<p> 파  일 : <input type="file" name="filename">
		<p> <input type="submit" value="파일 올리기">	
	</form>
</body>
</html>

 

 

// fileupload01_process

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="com.oreilly.servlet.*" %>
<%@ page import="com.oreilly.servlet.multipart.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<% 
	MultipartRequest multi = new MultipartRequest(request, "C:\\upload", 5 * 1024 * 1024, "utf-8", new DefaultFileRenamePolicy());
	
	Enumeration params = multi.getParameterNames();
	
	while (params.hasMoreElements()) {
		String name = (String) params.nextElement();
		String value = multi.getParameter(name);
		out.println(name + " = " + value + "<br>");
	}
	out.println("-------------------------------<br>");
	
	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>");
		
		if(file != null){
			out.println("파일 크기 : " + file.length());
			out.println("<br>");
		}
	}
%>

- 출력 -

 

 

 

 

 

MyltipartRequest 클래스를 이용하여 여러 파일 업로드 및 정보 출력하기

// fileupload02.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>File Upload</title>
</head>
<body>
	<form name="fileForm" method="post" enctype="multipart/form-data" action="fileupload02_process.jsp">
		<p> 이  름1 : <input type="text" name="name1">
		    제  목1 : <input type="text" name="subject1">
		    파  일1 : <input type="file" name="filename1">
		<p> 이  름2 : <input type="text" name="name2">
		    제  목2 : <input type="text" name="subject2">
		    파  일2 : <input type="file" name="filename2">
		<p> 이  름3 : <input type="text" name="name3">
		    제  목3 : <input type="text" name="subject3">
		    파  일3 : <input type="file" name="filename3">
		<p> <input type="submit" value="파일 올리기">
	</form>
</body>
</html>
// fileupload02_process.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="com.oreilly.servlet.*" %>
<%@ page import="com.oreilly.servlet.multipart.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<html>
<head>
<title>File Upload</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();
		
		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>
</html>

- 출력 -

 

 

 

 

 

 

 

Commons-FileUpload를 이용한 파일 업로드

Commons-FileUpload

  • 파일 업로드 패키지
  • 서버의 메모리상에서 파일 처리가 가능하도록 지원
  • 오픈 라이브러리 commons-fileupload.jar, commons-io.jar 파일을 배포 사이트에서 직접 다운로드해서 사용
  • JSP 페이지에 page 디렉티브 태그의 import 속성을 사용하여 패키지 org.apache.commons.fileupload.*를 설정

 

 

 

 

 

  • DiskFileUpload 클래스의 메소드

 

  • FileItem 클래스의 메소드

 

 

 

 

Commons-FileUpload를 이용하여 파일 업로드하기

// fileupload03.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>File Upload</title>
</head>
<body>
	<form action="fileupload03_process.jsp" method="post" enctype="multipart/form-data">
		<p> 파 일 : <input type="file" name="filename">
		<p> <input type="submit" value="파일 올리기">
	</form>
</body>
</html>
// fileupload03_process.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<html>
<head>
<title>File Upload</title>
</head>
<body>
	<%
		String fileUploadPath = "C:\\upload2";
	
		DiskFileUpload upload = new DiskFileUpload();
		
		List items = upload.parseRequest(request);
		
		Iterator params = items.iterator();
		
		while (params.hasNext())  {
			FileItem fileItem = (FileItem) params.next();
			if(!fileItem.isFormField()) {
				String fileName = fileItem.getName();
				fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
				File file = new File(fileUploadPath + "/" + fileName);
				fileItem.write(file);
			}
		}
	%>
</body>
</html>

 

 

 

 

Commons-FileUpload를 이용하여 파일 업로드 및 정보 출력하기

// fileupload.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>File Upload</title>
</head>
<body>
	<form name="fileForm" method="post" enctype="multipart/form-data" action="fileupload04_process.jsp">
		<p> 이 름 : <input type="text" name="name">
		<p> 제 목 : <input type="text" name="subject">
		<p> 파 일 : <input type="file" name="filename">
		<p> <input type="submit" value="파일 올리기">
	</form>
</body>
</html>
// fielupload04_process.jsp

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="java.util.*" %>
<%@ page import="java.io.*" %>
<html>
<head>
<meta charset="UTF-8">
<title>File Upload</title>
</head>
<body>
	<%
		String path = "C:\\upload2";
	
		DiskFileUpload upload = new DiskFileUpload();
		
		upload.setSizeMax(1000000);
		upload.setSizeThreshold(4096);
		upload.setRepositoryPath(path);
		
		List items = upload.parseRequest(request);
		Iterator params = items.iterator();
		
		while (params.hasNext())  {
			FileItem item = (FileItem) params.next();
			if(item.isFormField()) {
				String name = item.getFieldName();
				String value = item.getString("utf-8");
				out.println(name + "=" + value + "<br>");
			} else {
				String fileFieldName = item.getFieldName();
				String fileName = item.getName();
				String contentType = item.getContentType();
				
				fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
				long fileSize = item.getSize();
				
				File file = new File(path + "/" + fileName);
				item.write(file);
				
				out.println("--------------------------<br>");
				out.println("요청 파라미터 이름 : " + fileFieldName + "<br>");
				out.println("저장 파일 이름 : " + fileName + "<br>");
				out.println("파일 콘텐츠 유형 : " + contentType + "<br>");
				out.println("파일 크기 : " + fileSize);						
			}
		}
	%>
</body>
</html>

 

 

728x90
반응형