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>
- Commons IO – Download Apache Commons IO
- FileUpload – Download Apache Commons FileUpload
- 서버 메모리상 파일 처리가 가능하도록 지원하는 파일 업로드 패키지
- 아파치 프로젝트에서 제공하는 파일 업로드 오픈소스
- DiskFileUpload, FileItem 클래스 메소드를 통해 파일 업로드 가능