Development/JSP

파일 업로드

우봉수 2023. 5. 9. 23:54

파일 업로드 개요

  • 웹 브라우저에서 서버로 파일을 전송하여 서버에 저장하는 것
  • 사용자 인터페이스 (JSP에서는 Form 태그) 필요
    • form 태그 method 속성은 반드시 POST
    • form 태그 enctype 속성은 반드시 multipart/form-data
    • form 태그 action 속성은 파일 업로드를 처리할 jsp 파일로 설정
    • 파일 업로드를 위해 input 태그 type 속성을 file로 설정
  • 오픈 라이브러리를 이용해 구현 (JDK에 파일 업로드 기능 존재 x)
    • cos.jar 또는 commonsfileupload.jar 사용
  • 백엔드 작업 중 사용자에게 진행 상황을 보여주어야 한다.

파일 업로드 (MultipartRequest)

<upload.jsp>

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head></head>
<body>
	<form action="status.jsp" enctype="multipart/form-data" method="post">
		<p>
			제목: <input type="text" name="title">
		</p>
		<p>
			파일: <input type="file" name="filename">
		</p>
		<input type="submit" value="submit">
	</form>
</body>
</html>

<status.jsp>

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<%@ page import="com.oreilly.servlet.*, com.oreilly.servlet.multipart.*"%>
<%@ page import="java.io.*, java.util.*"%>
<!DOCTYPE html>
<html>
<head></head>
<body>
	<%
	MultipartRequest multi = new MultipartRequest(request, "C:\\\\upload", 5 * 1024 * 1024, "utf-8",
			new DefaultFileRenamePolicy());
	String title = multi.getParameter("title");
	out.println("<h3>" + title + "</h3");
	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("<p>요청 파라미터 이름: "+ name + "</p>");
		out.println("<p>실제 파일 이름: "+ original + "</p>");
		out.println("<p>저장 파일 이름: "+ fileName + "</p>");
		out.println("<p>파일 콘텐츠 유형: "+ type + "</p>");
		if(file != null) {
		out.println("<p>파일 크기: " + file.length() + 
		"</p>");
		}
	}
	%>
</body>
</html>
  • http://www.servlets.com/cos/
  • 웹 페이지에서 서버로 업로드되는 파일 자체만 다루는 클래스
  • 웹 브라우저가 전송한 데이터를 일반 데이터와 파일 데이터로 구분하여 파일 데이터에 접근
    • 일반 데이터: getParameterNames()
    • 파일 데이터: getFileNames()
  • 한글 인코딩 값을 얻기 쉽다, 서버의 파일 저장 폴더에 동일한 파일명이 있으면 파일명 자동으로 변경
  • 의존성 획득 방법: Maven, Gradle, 직접 다운로드 후 라이브러리 파일에 집어 넣기

파일 업로드 (Commons-FileUpload)

<upload.jsp>

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head></head>
<body>
	<form action="status.jsp" enctype="multipart/form-data" method="post">
		<p>
			제목: <input type="text" name="title">
		</p>
		<p>
			파일: <input type="file" name="filename">
		</p>
		<input type="submit" value="submit">
	</form>
</body>
</html>

<status.jsp>

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

<!DOCTYPE html>
<html>
<head></head>
<body>
	<%
	String fileUploadPath = "c:\\\\upload";
	DiskFileItemFactory factory = new DiskFileItemFactory();
	ServletFileUpload upload = new ServletFileUpload(factory);
	List items = null;
	try {
	    items = upload.parseRequest(request);
	} catch (FileUploadException e) {
	    e.printStackTrace();
	}
	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);
			try {
			    fileItem.write(file);
			} catch (Exception e) {
			    e.printStackTrace();
			}
			out.println("<p>File name: " + fileName + "</p>");
			out.println("<p>File size: " + fileItem.getSize() + " bytes</p>");
			out.println("<p>File type: " + fileItem.getContentType() + "</p>");
		}
	}
	%>
</body>
</html>