WEB/JSP

JSP 14 - 파일업로드

inderrom 2023. 1. 4. 13:51

<commons.jar 라이브러리를 이용한 파일 업로드>

 

파일 업로드를 위한 jar 파일을 다운 받는다.

 

https://mvnrepository.com/

 

 

 

commons-fileupload - 1.3.3버전

 

 

commons-io - 2.6버전

 

프로젝트 내 Webcontent -> WEB-INF -> lib 폴더에 드랍

 

 

 

<fileupload03.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<!--  commons-fileupload.jar 오픈 라이브러리
	  - 서버(톰캣 컨테이너)의 메모리상에서 파일 처리가 가능하도록 지원해줌
	  - (JSP)DiskFileUpload 객체
	  - (SPRING)MultipartFile 객체
	  - DiskFileUpload upload...
	  -   	upload.setRepositoryPath(경로) : 업로드된 파일을 임시로 저장할 디렉토리 설정
	  -   	upload.setSizeMax(long 최대 파일의 크기)
	  -		upload.setSizeThreshold(int 메모리상의 저장 최대 크기)
	  -		upload.parseRequest(HttpServletRequest 요청 파라미터를 담은 객체(req))
	  -		parse : 구문분석/의미분석
	  			ex) 김대리 xml 파싱했나요?=> xml의 구문과 의미를 분석하여 처리했나요?-->
	<!-- 폼페이지-->
	<form action="fileupload03_process.jsp" method="post"
			enctype="multipart/form-data">
		<p>파일 : <input type="file" name="filename" /></p>
		<p><input type="submit" name="파일 올리기" /></p>
	</form>
</body>
</html>

 

 

<fileupload03_process.jsp>

<%@page import="java.io.File"%>
<%@page import="org.apache.commons.fileupload.FileItem"%>
<%@page import="java.util.Iterator"%>
<%@page import="java.util.List"%>
<%@page import="org.apache.commons.fileupload.DiskFileUpload"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


<%
/* FileItem의 메소드 
	- *isFormField() : 폼데이터 맞니? 파일객체가 아닌 거 맞아?일반 데이터 맞지?
						file을 가져오므로 false가 나온다
	- *getFiledName() : 요청 파라미터 이름을 String으로 리턴(filename)
	- *getString() : 요청 파라미터의 값을 얻어옴(일반 데이터의 경우 name=value에서 value)
	- *getName() : 파일의 이름을 가져옴(경로 포함) : c:_upload_롬.jpg
	- *getSize() : 파일의 크기(롬.jpg의 크기)
	-* get() : 업로드된 파일을 바이트 배열로 얻어옴
	- isInMemory() : 메모리에 저장되면 true, 임시 디렉토리에 저장되면 false
	- delete() : 파일 관련 자원 삭제
	- *write() : 파일을 저장
	- getContentType() : 파일의 컨텐츠 유형 반환(images/jpeg) 
	
	(자주 사용하는 것 *표시)

*/
	// 서버에 저장할 경로 설정(윈도우 폴더 경로는 역슬래쉬 두개)
	String fileUploadPath = "D:\\upload";
	DiskFileUpload upload = new DiskFileUpload();
	//upload.parseRequest(HttpServletRequest 요청 파라미터를 담은 객체(req))
	//request내장 객체 안에 <input type="file" name="filename" /> 객체가 들어있음
	List items = upload.parseRequest(request);
	// 열거형으로 데이터를 가져와보자
	Iterator params = items.iterator();
	// params.hasNext() : 폼 페이지에서 전송된 요청 파라미터가 더이상
	// 없을때까지 반복
	while(params.hasNext()){
		// 폼 페이지에서 전송된 요청 파라미터의 오브젝트를 가져옴
		FileItem fileItem = (FileItem)params.next();
		//일반 데이터 맞지?
		if(!fileItem.isFormField()){
			// 파일의 이름을 가져옴(경로 포함)
			String fileName = fileItem.getName();
			out.print("fileName(전)" + fileName);
			// 파일의 경로를 제외한 순수 파일명만 추출하여 파일명만 변수에 저장
			// D:\\upload\\롬.jsp 에서 \\ 를 찾아서 그 뒤에 +1를 해준 위치가 시작점
			fileName = fileName.substring(fileName.lastIndexOf("\\" )+1);
			out.print("fileName(후)" + fileName);
			// 파일 객체 생성(설계도) : 서버에 저장할 경로 및 파일명 설정
			File file = new File(fileUploadPath + "/" + fileName);
			// 파일 복사 실행(설계도 구현)
			fileItem.write(file);
			
		}
	}

%>

<fileupload04.jsp>

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
</head>
<body>
<!--  commons-fileupload.jar 오픈 라이브러리
	  - 서버(톰캣 컨테이너)의 메모리상에서 파일 처리가 가능하도록 지원해줌
	  - (JSP)DiskFileUpload 객체
	  - (SPRING)MultipartFile 객체
	  - DiskFileUpload upload...
	  -   	upload.setRepositoryPath(경로) : 업로드된 파일을 임시로 저장할 디렉토리 설정
	  -   	upload.setSizeMax(long 최대 파일의 크기)
	  -		upload.setSizeThreshold(int 메모리상의 저장 최대 크기)
	  -		upload.parseRequest(HttpServletRequest 요청 파라미터를 담은 객체(req))
	  -		parse : 구문분석/의미분석
	  			ex) 김대리 xml 파싱했나요?=> xml의 구문과 의미를 분석하여 처리했나요?-->
	<!-- 폼페이지-->
	<form action="fileupload04_process.jsp" method="post"
			enctype="multipart/form-data">
		<p>이름 : <input type="text" name="name" /></p>
		<p>제목 : <input type="text" name="subject"/></p>
		<p>파일 : <input type="file" name="filename" /></p>
		<p><input type="submit" name="파일 올리기" /></p>
	</form>
</body>
</html>

<fileupload04_process.jsp>

<%@page import="java.io.File"%>
<%@page import="org.apache.commons.fileupload.FileItem"%>
<%@page import="java.util.Iterator"%>
<%@page import="java.util.List"%>
<%@page import="org.apache.commons.fileupload.DiskFileUpload"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%
	// 파일 저장 path
	String path = "D:\\upload";
	// commons- fileupload.jar 안에 해당 클래스가 있음
	DiskFileUpload upload = new DiskFileUpload();
	// long 최대 파일의 크기(1Mbytes)
	upload.setSizeMax(1000000);
	// int 메모리상의 저장 최대크기 (4kbytes)
	upload.setSizeThreshold(4096);
	// 임시로 저장할 디렉토리 설정
	upload.setRepositoryPath(path);
	// 요청파라미터를 받음
	// formField(name=롬&subject=소설) 2개
	// 파일객체(filename이라는 파일객체) 1개
	// parse : 구문/의미분석
	// items.items.size() = > 3
	List items = upload.parseRequest(request);
	// items 리스트 object를 Iterator(열거) 클래스로 변환
	Iterator params = items.iterator();
	// 요청 파라미터가 없을 때까지 반복(3회 반복)
	while(params.hasNext()){
		// FileItem : 1. 일반 데이터(name, subject) 2. 파일(filename)
		FileItem item = (FileItem)params.next();
	
		if(item.isFormField()){  //1. 일반 데이터(name, subject)
			// ?name=롬월드&subject=소설
			String name = item.getFieldName();  // 파라미터의 name값 가져옴(name, subject)
			String value = item.getString("UTF-8");  // 파라미터의 value값 가져옴(롬월드,소설)
			// name = 롬월드
			// subject = 소설
			out.print("<p>" + name + " = " + value + "</p>");
		}else{// 파일(filename))
			String fileFieldName = item.getFieldName(); //파라미터의 name값 가져옴(filename)
			String fileName = item.getName();  // 선택 된 업로드할 파일명
			String contentType = item.getContentType(); //  MIME 타입(만약 이미지 : image/jpeg)
			
			// 파일명만 추출(client쪽의 경로는 제외)
			// D:\\Users\\test\\Pictures\\롬월드.png
			// 마지막 \\의 위치를 찾아서 +1을 하면 "롬"부터 끝까지 추출 => 롬월드.png
			fileName = fileName.substring(fileName.lastIndexOf("\\") +1);
			// 파일의 크기
			long fileSize = item.getSize();
			//D:\\upload\\롬월드.png로 복사해야함 => 계획
			File file = new File(path + "/" + fileName);
			// 파일 복사 실행
			item.write(file);
			
			out.print("==============<br />");
			out.print("요청 파라미터 이름 : " + fileFieldName + "<br />");
			out.print("저장 파일 이름 : " + fileName + "<br />");
			out.print("파일 콘텐츠 유형 : " + contentType + "<br />");
			out.print("파일 크기 : " + fileSize + "<br />");
		}
		
	}
	
%>

 


<cos.jar 라이브러리를 이용한 파일 업로드>

 

 

MultipartRequest 클래스를 이용하여 파일 업로드를 한다.

 

 

ex)

MultipartRequest multi = new MultipartRequest(request, "D:\\upload", 5 * 1024 * 1024,
									"utf-8", new DefaultFileRenamePolicy())

( ) 안에는 requeset, 파일을 저장할 폴더 경로, 크기 ,  context설정을 할 수 있고

 

DefaultFileRenamePolicy() : 중복된 파일을 저장할 경우 이름 뒤에 1을 붙혀준다. (중복제거, 정규화)

// 예를들어 파일 이름이 p1234.jpg ->  같은 파일을 다시 업로드 하면 p12341로 저장됨

 

 

 

전체 파라미터를 꺼낼 때는 Enumeration을 이용해서 꺼내준다.

 

<%@page import="java.io.File"%>
<%@page import="java.util.Enumeration"%>
<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>
<%@page import="com.oreilly.servlet.MultipartRequest"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>하하</title>
</head>
<body>
	<%
		MultipartRequest multi = new MultipartRequest(request, "D:\\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 original = multi.getOriginalFileName(name);
			String filename = multi.getFilesystemName(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>");
			}
		
		}
		
	%>
	
	
</body>
</html>

 

결과