WEB/JSP
JSP 14 - 파일업로드
inderrom
2023. 1. 4. 13:51
<commons.jar 라이브러리를 이용한 파일 업로드>
파일 업로드를 위한 jar 파일을 다운 받는다.
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>
결과