JAVA

jsp 파일 업로드 예제

인생마린 2021. 5. 12. 09:59
반응형

fileSelect.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!doctype html>
<html lang="ko">
<head>
	<meta charset="UTF-8">
	<meta name="viewport"
	      content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title>단일 파일 업로드</title>
</head>
<body>
<form action="fileUpload.jsp" name="fileForm" method="post" enctype="multipart/form-data">
	작성자: <input type="text" name="user"><br>
	제목: <input type="text" name="title"><br>
	파일명: <input type="file" name="uploadFile"><br>
	<input type="submit" value="파일 업로드">
</form>
</body>
</html>

먼저 파일 업로드는 form태그에 <input type="file">을 통해서 하게 됩니다. 하지만 별다른 처리를 하지 않으면 실제로 넘어오는건 업로드한 파일이름만 넘어오고, 파일자체는 넘어오지 않습니다. 먼저 파일업로드를 받기 위해서는 enctype="multipart/form-data" 속성을 추가해줘야 됩니다.

 

이제 cors.jar을 이용해서 업로드를 받아야되는데요

www.servlets.com/cos/

 

Servlets.com | com.oreilly.servlet

 

www.servlets.com

아래 파일을 다운받아서 라이브러리에 추가해줍니다.

cos.jar
0.05MB

 

 

이제 파일을 업로드 받아 저장하고, 받은 파라미터 정보를 출력하는 파일을 만들어보겠습니다.

 

fileUpload.jsp

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

<%
	String realFolder = "";

	String saveFolder = "fileSave"; // out폴더에 fileSave 폴더 생성
	String encType = "utf-8";
	int maxSize = 5*1024*1024; // 최대 업로드 5mb

	ServletContext context = request.getServletContext();
	realFolder = context.getRealPath(saveFolder);
	out.println("the realpath is: " + realFolder + "<br>");

	try {
	    MultipartRequest multi = null;

	    multi = new MultipartRequest(request, realFolder, maxSize, encType, 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() + "<br>");
		    }
	    }

	}catch (IOException ioe) {
		System.out.println(ioe);
	} catch (Exception ex) {
		System.out.println(ex);
	}
%>
  • MultiRequest (javax.servlet.http.HttpServletRequst request,
    java.lang.String saveDirectory,
    int maxPostSize,
    java.lang.String encoding,
    FileRenamePolicy policy)
  • Enumteration getParameterNames() : 전송된 파라미터들의 이름을 Enumeration 타입으로 리턴
  • String getParameter(String name) : 해당하는 이름의 파라미터 값을 리턴
  • String getFilesystemName(String name) : 실제 파일이 업로드된 위치
  • String getOriginalFileName(String name) : 사용자가 폼에서 직접 지정한 파일명 리턴
  • String getContentType(String name) : 업로드 된 파일의 타입
  • File getFile(name) :업로드된 파일 객체를 얻어낼 때 사용

위 메소드들을 사용하여 받은 파라미터와 파일 이름, 경로 등을 받아올 수 있습니다.

실행전에 fileSave 폴더를 생성해주어야 정상적으로 작동 됩니다.

 

fileSelect.jsp
fileUpload.jsp
파일 업로드 된것 확인

 

 

 

 

multiple하게 파일 업로드 하기

http://commons.apache.org/

 

Apache Commons – Apache Commons

Welcome to Apache Commons Apache Commons is an Apache project focused on all aspects of reusable Java components. The Apache Commons project is composed of three parts: The Commons Proper - A repository of reusable Java components. The Commons Sandbox - A

commons.apache.org

위 사이트에서

'commons-fileupload bin.zip', 'commons-io bin.zip' 파일을 다운로드

commons-fileupload-1.4.jar
0.07MB
commons-io-2.8.0.jar
0.27MB

 

multiple.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
	request.setCharacterEncoding("utf-8");
	int filecounter = 0;
	if(request.getParameter("addcnt")!= null) {
		filecounter = Integer.parseInt(request.getParameter("addcnt"));
	}
%>

<html>
<head>
	<title>여러개 파일을 업로드</title>
</head>
<body>
<h2>여러개의 파일을 업로드하는 예제</h2>

<form method="post" action="multipleAction.jsp" enctype="multipart/form-data">
	<table border="1px">
		<tr>
			<td>작성자</td>
			<td><input type="text" name="user"></td>
		</tr>
		<tr>
			<td>제목</td>
			<td><input type="text" name="title"></td>
		</tr>
		<tr>
			<td>내용</td>
			<td><input type="text" name="content"></td>
		</tr>
		<tr>
			<td>파일업로드</td>
			<td><input type="file" name="files" multiple></td>
		</tr>
		<tr>
			<td><input type="submit" value="업로드"></td>
		</tr>
	</table>
</form>
</body>
</html>

 

multipleAction.jsp

<%@page contentType="text/html;charset=utf-8" %>
<%@page import="java.util.*" %>
<%@page import="org.apache.commons.fileupload.FileItem" %>
<%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload" %>
<%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %>
<%@ page import="java.io.File" %>
<%@ page import="org.apache.commons.fileupload.FileUploadException" %>

<%
	request.setCharacterEncoding("utf-8");
	String realPath = "";
	String savePath = "fileSave";
	String type = "utf-8";
	int maxSize = 10*1024*1024; // 10mb
	ServletContext context = request.getServletContext();
	realPath = context.getRealPath(savePath);
	ArrayList saveFiles = new ArrayList();
	ArrayList origFiles = new ArrayList();


		try {
			DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
			diskFileItemFactory.setRepository(new File(realPath));
			diskFileItemFactory.setSizeThreshold(maxSize);
			diskFileItemFactory.setDefaultCharset("utf-8");
			ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);


			List<FileItem> items = fileUpload.parseRequest(request);
			for (FileItem item : items) {
				if (item.isFormField()) {
					out.print(String.format("[파일형식이 아닌 파라미터] 파라미터명: %s, 파일 명: %s, 파일크기: %s bytes <br>", item.getFieldName(), item.getString(), item.getSize()));
				} else {
					out.print(String.format("[파일형식 파라미터] 파라미터명: %s, 파일 명: %s, 파일 크기: %s bytes <br>", item.getFieldName(), item.getName(), item.getSize()));
					if (item.getSize() > 0) {
						String separator = File.separator;
						int index = item.getName().lastIndexOf(separator);
						String fileName = item.getName().substring(index + 1);
						File uploadFile = new File(realPath + separator + fileName);
						item.write(uploadFile);
					}
				}

			}
		} catch (FileUploadException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}



%>

 

 

 

 

 

multiple 속성을 사용하여 여러개의 파일을 업로드 하고싶다면 이렇게 하면 잘 작동하는걸 볼 수 있다.

반응형