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>