본문 바로가기
도서/프로그래밍

[06] 쉽게 배우는 JSP 웹 프로그래밍

by 신발사야지 2024. 1. 19.

07 파일 업로드

01 파일 업로드의 개요

서버로 파일을 전송하기 위해 JSP 페이지에 폼 태그를 사용

전송된 파일을 서버에 저장하기 위해 오픈 라이브러리를 이용

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

  1. form 태그의 method 속성은 반드시 POST 방식으로 설정해야 합니다.
  2. form 태그의 enctype 속성은 반드시 multipart/form-data로 설정해야 합니다
  3. form 태그의 action 속성은 파일 업로드를 처리할 JSP 파일로 설정해야 합니다.
  4. 파일 업로드를 위해 input 태그의 type 속성을 file로 설정해야 합니다. 만약 여러 파일을 업로드하려면 2개 이상의 input 태그를 사용하고 name 속성에 서로 다른 값을 설정합니다.

파일 업로드 처리 방법

웹 브라우저에서 서버로 파일을 업로드하면 서버는 요청 파라미터를 분석하여 파일을 찾고 서버의 자원(파일 저장 폴더)에 저장하는 과정을 거칩니다. 이러한 처리는 단순한 자바 코드로 처리할 수 없어 오픈 라이브러리인 cos.jar 또는 commonsfileupload.jar를 사용해야 합니다.

02 MultipartRequest를 이용한 파일 업로드

01 MultipartRequest 클래스 생성

MultipartRequest는 웹 페이지에서 서버로 업로드되는 파일 자체만 다루는 클래스입니다.

MultipartRequest 생성자의 매개변수

매개변수 설명

request Request 내장 객체를 설정한다.
saveDirectory 서버의 파일 저장 경로를 설정한다.
maxPostSize 파일의 최대 크기(바이트 단위)를 설정한다. 최대 크기를 초과하면 IOException이 발생한다.
encoding 인코딩 유형을 설정한다.
policy 파일명 변경 정책을 설정한다. saveDirectory에 파일명이 중복되는 경우 덮어쓰기 여부를 설정하며, 설정하지 않으면 덮어쓴다.

02 MultipartRequest 메소드

메소드 유형 설명

getContentType(String name) String 업로드된 파일의 콘텐츠 유형을 반환한다. 업로드 된 파일이 없으면 null을 반환한다.
getParameter(String name) String 요청 파라미터 이름이 name인 값을 전달받는다
getParameterNames() Enumeration 요청 파라미터 이름을 Enumeration 객체 타입으로 반환한다.
getFile(String name) java.io.File 서버에 업로드된 파일에 대한 파일 객체를 반환한다. 없으면 null
getFileNames() Enumeration 폼 페이지에 input 태그 내 type 속성 값이 file로 설정된 요청 파라미터의 이름을 반환한다.
getFilesystemName(String name) String 사용자가 설정하여 서버에 실제로 업로드된 파일명을 반환한다. 파일명이 중복되면 변경된 파일명을 반환한다.
getOriginalFileName(String name) String 사용자가 업로드한 실제 파일명을 반환한다.
<%@ 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>

 

 

<%@ 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>
	<%
	MultipartRequest m = new MultipartRequest(request, "C:\\\\upload", 5 * 1024 * 1024, "utf-8", new DefaultFileRenamePolicy());
	
	Enumeration params = m.getParameterNames();
	
	while(params.hasMoreElements()){
		String name = (String) params.nextElement();
		String value = m.getParameter(name);
		out.println(name + " = " + value + "<br>");
	}
	out.println("-----------------------------<br>");
	
	Enumeration files = m.getFileNames();
	
	while(files.hasMoreElements()){
		String name = (String) files.nextElement();
		String filename = m.getFilesystemName(name);
		String original = m.getOriginalFileName(name);
		String type = m.getContentType(name);
		File file = m.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() + "<br>");
		}
	}
	
	%>
</body>
</html>

 

 

 

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

서버의 메모리상에서 파일 처리가 가능

<%@ 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>

 

 

 

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<%@ page import="org.apache.commons.fileupload.*"%>
<%@ page import="java.io.*"%>
<%@ page import="java.util.*"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>File Upload</title>
</head>
<body>
	<%
	String path = "C:\\\\upload";
	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 + "<br>");
		
		}
	}
	%>
</body>
</html>