JSP
JSP - 파일 업로드(file upload)
행복하게사는게꿈
2020. 6. 24. 10:34
파일 업로드(file upload)
[FileUploadForm.jsp]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!--
클라이언트의 파일 업로드 처리 : 쿼리스트링 전송방식 : POST
content type = multipart/form-data
<form>
ajax
* 바이너리 스트리밍을 통한 서버 전송 처리
(폼필드 - mem_id, mem_pass, ..., 파일)
-->
<form action="${pageContext.request.contextPath }/14/result.jsp" method="post" enctype="multipart/form-data">
<table>
<tr>
<td>아이디</td>
<td><input type="text" name="mem_id" /></td>
</tr>
<tr>
<td>패스워드</td>
<td><input type="text" name="mem_pass"/></td>
</tr>
<tr>
<td>성명</td>
<td><input type="text" name="mem_name"/></td>
</tr>
<tr>
<td>파일1</td>
<td><input type="file" name="files" /></td>
</tr>
<tr>
<td>파일2</td>
<td><input type="file" name="files" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="전송" /></td>
</tr>
</table>
</form>
</body>
</html>
[result.jsp]
<%@page import="java.io.File"%>
<%@page import="org.apache.commons.io.FilenameUtils"%>
<%@page import="org.apache.commons.fileupload.FileItem"%>
<%@page import="java.util.List"%>
<%@page import="org.apache.commons.fileupload.disk.DiskFileItemFactory"%>
<%@page import="org.apache.commons.fileupload.servlet.ServletFileUpload"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 클라이언트(브라우저) 보안정책(Security Policy)
// 브라우저는 해당 하드웨어 시스템 내 파일 또는 디렉토리에 접근은 가능하지만
// 신규 파일 또는 디렉토리의 생성, 파일 및 디렉토리 수정과 삭제는 불가능
// * IE ActiveX를 활용해서 파일 생성, 수정, 삭제가 가능
// 서버의 파일 업로드 처리 개발환경
// 1. 라이브러리
// http://commons.apache.org
// commons-fileupload-1.2.2.jar
// commons-fileupload-2.3.jar
// WEB-lib
// 서버 대상 업로드된 파일의 저장 처리 : 서버 내 특정 파일 시스템 활용
// 파일 정보들은 DB 대상 저장
out.println(application.getRealPath("/upload"));
String fileSavePath = application.getRealPath("/upload");
int fileSizeMax = 1024 * 1024 * 100;
// 클라이언트(브라우저) 서버 대상 요청
// 일반 요청
// 1.직접 브라우저의 주소창에 URL을 입력.
// 2.location.href = '주소'
// 3.location.replace('주소')
// 4.<a href ="주소">클릭</a>
// 5.<form action=""></form> (enctype=application/x-www-form-urlencoded)
// 6.ajax
// 스트리밍 요청(파일)
// 1.<form action="" method="POST" enctype=multipart/form-data)></form>
// 2.ajax(method =POST, enctype=multipart/form-data)
// 일반요청인지 스트리밍 요청인지를 구분
boolean multipartFlag = ServletFileUpload.isMultipartContent(request);
// 스트리밍 요청이면 true, 일반요청이면 false
if(multipartFlag){
//서버의 업로드된 파일 처리
// 1. 업로드된 파일의 임시저장소(서버 내 서버가 관리하는 파일 시스템, 서버의 메모리) 저장
// * 임시저장소에 저장되는 파일의 확장자 : *.tmp
// * 임시저장소에 저장되는 대상 파일의 사이즈 제한
// * 임시저장소로 활용되는 서버내 특정 파일 패스를 지정
// 2. 업로드된 파일의 실제 저장소 저장
// * 실제 저장소 저장 대상 파일의 사이즈 제한
// * 실제 저장소로 활용될 서버 내 특정 파일 패스
// 3. 임시저장소에 저장된 파일의 실제저장소 저장시 임시저장소에 저장되었던 파일은 자동 삭제
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(fileSizeMax);
//factory.setRepository(new File("임시저장소소로 활용될 서버 내 파일 패스"));
ServletFileUpload servletFileUpload = new ServletFileUpload(factory);
// 서버대상 업로드된 파일 단위의 파일 사이즈 제한
servletFileUpload.setFileSizeMax(fileSizeMax);
// 서버대상 업로드된 전체 파일 대상의 사이즈 제한
servletFileUpload.setSizeMax(fileSizeMax);
// fileUplaodForm.jsp (form 태그 method=POST, enctype=multipart/form-data)
// FileItem
// 폼필드
// input[type=text name=mem_id]
// input[type=text name=mem_pass]
// input[type=text name=mem_name]
// 파일
// input[type=file name=mem_name]
List<FileItem> items = servletFileUpload.parseRequest(request);
for(FileItem item : items){
if(item.isFormField()){ // true면 formField 아니면 false
// 폼필드
// input[type=text name=mem_id]
// input[type=text name=mem_pass]
// input[type=text name=mem_name]
out.println("폼필드</br>");
out.println("폼필드 키 : " + item.getFieldName() + "</br>");
out.println("폼필드 값 : " + item.getString("UTF-8")+"</br>");
}else{
out.println("파일</br>");
out.println("파일의 키 : " + item.getFieldName() + "</br>");
out.println("파일 파일명 : " + item.getName() + "</br>");
out.println("파일 컨텐츠 타입 : " + item.getContentType() + "</br>");
out.println("파일 사이즈 : " + item.getSize()+ "</br>");
// 브라우저별 파일명 전송 처리
// 어떤 브라우저는 그 파일의 경로까지 다 포함하는 경우도 있고, 파일명만 쓰는 경우도 있다.
// d:\temp\a.png or a.png
// 이걸쓰면 무적권 파일명만 리턴해줌
String fileName = FilenameUtils.getName(item.getName());
File saveFile = new File(fileSavePath, fileName);
item.write(saveFile);
}
}
}
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>