fileUploadTest

fileVO

package kr.or.ddit.basic.vo;


public class fileVO {

   private String fileName; //파일이름
   private long fileSize; //파일크기
   private String uploadStatus; //upload성공 여부
   
   public String getFileName() {
      return fileName;
   }
   public void setFileName(String fileName) {
      this.fileName = fileName;
   }
   public long getFileSize() {
      return fileSize;
   }
   public void setFileSize(long fileSize) {
      this.fileSize = fileSize;
   }
   public String getUploadStatus() {
      return uploadStatus;
   }
   public void setUploadStatus(String uploadStatus) {
      this.uploadStatus = uploadStatus;
   }
   
   
   
}

fileUploadTest.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>File Upload 연습</h2>

<!-- multipart/form-data : 파일 전송시 반드시 필요한 속성 -->
<form method="post" enctype="multipart/form-data" action="<%=request.getContextPath()%>/fileUploadTest.do">
이름 : <input type="text" name="userName"><br>
파일1개 선택 : <input type="file" name="uploadFile1"><br>
다중파일 선택 : <input type="file" name="uploadFile2" multiple><br>
<button tyle="submit">자료 전송</button>
</form>
<br><hr><br>
<a href="<%=request.getContextPath()%>/uploadFileList.do">
  업로드된 전체 파일 목록 가져오기</a>
  
</body>
</html>


uploadFileList.do

package kr.or.ddit.basic.filetest;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.or.ddit.basic.vo.fileVO;


@WebServlet("/uploadFileList.do")
public class UploadFileList extends HttpServlet {
	private static final long serialVersionUID = 1L;


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// Upload된 전체 파일 목록을 구성하는 서블릿
		String uploadPath = "d:/d_other/uploadFiles";
				
		//저장될 폴더가 없으면 새로 생성한다.
		File fileUploadDir = new File(uploadPath);
				
		if(!fileUploadDir.exists()) {
			fileUploadDir.mkdir();
		}
		//파일이 저장된 폴더에서 전체 파일목록을 구해와서 List에 담아준다.
		File[] allFiles = fileUploadDir.listFiles();
		List<fileVO> fileList = new ArrayList<fileVO>();
		
		for(File file : allFiles) {
			if(file.isFile()) {
				fileVO fvo = new fileVO();
				fvo.setFileName(file.getName());
				fvo.setFileSize((int)Math.ceil(file.length() / 1024.0));
				fvo.setUploadStatus("Success");
				fileList.add(fvo);
			}
		}
		
	
		request.setAttribute("uploadFileList", fileList);
		
		RequestDispatcher rd =
				request.getRequestDispatcher("/fileupload/uploadFiles.jsp");
		rd.forward(request, response);
		
		
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

uploadFiles.jsp

<%@page import="kr.or.ddit.basic.vo.fileVO"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Servlet File Upload</title>
</head>
<body>
<%
   String userName = (String)request.getAttribute("userName"); //이름을 받아온것
   List<fileVO> fileList = 
        (List<fileVO>)request.getAttribute("uploadFileList");
%>
<%
   if(userName!=null){
%>	
    <h2><%=userName %>임이 방금 업로드 한 파일 목록</h2>	
<%

}else{
  
%>
    <h2>전체 업로드 한 파일 목록</h2>	
<%
}
%>
    <table border='1'>
    <tr>
      <td>파일이름</td><td>파일크기</td><td>업로드상태</td><td>비고</td>
    </tr>
    
<%
    if(fileList!=null){
    	for(fileVO fileVo : fileList){
%> 
   <tr>
     <td><%=fileVo.getFileName()%></td>
     <td><%=fileVo.getFileSize()%></td>
     <td><%=fileVo.getUploadStatus()%></td>
     <td><a href="<%=request.getContextPath()%>/fileDownLoad.do?filename=<%=fileVo.getFileName()%>">DownLoad</a></td>
   </tr>
<%   		
    	}
    }
%>
   </table>
   <br><hr><br>
   <a href="<%=request.getContextPath()%>/fileupload/fileUploadTest.jsp">
           파일 업로드 시작문서로 가기</a>
   
</body>
</html>

fileUploadTest.do

package kr.or.ddit.basic.filetest;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;

import kr.or.ddit.basic.vo.fileVO;



/*
 *  Servlet 3.0이상에서 파일 업로드를 처리하려명 서블릿에
 *  @MultipartConfig라는 애노테이션을 설정해야 한다.
 *  
 *  @MultipartConfig 애노테이션 설정 방법(사용되는 변수 및 역할)
 *  1) location : 업로드한 파일이 임시적으로 저장될 경로를 지정한다.
 *                (기본값 : "")
 *  2) fileSizeThreshold : 이 속성에서 지정한 크기보다 큰 파일은 
 *     위의 location에서 지정한 디스크의 임시 디렉토리에 저장
 *      (단위 : byte, 기본값 : 0 (무조건 임시 디렉토리를 사용한다.))
 *  3) maxFileSize : 1개의 파일의 최대 크기 
 *      (단위:byte, 기본값:-1L(무제한))
 *  4) maxRequestSize : 서버로 전송되는 Request데이터의 최대 크기
 *      (단위:byte, 기본값:-1L(무제한))
 *     
 */
@WebServlet("/fileUploadTest.do")
@MultipartConfig(
		fileSizeThreshold = 1024 * 1024 * 10, 
		maxFileSize = 1024 * 1024 * 30, maxRequestSize = 1024 * 1024 * 50 //전체는 50이 넘어가지 않도록해라
		)
public class FileUploadTest extends HttpServlet {
	private static final long serialVersionUID = 1L;
    
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// upload한 파일이 저장될 폴더 설정
		String uploadPath = "D:/D_Other/uploadFiles";
		
		//저장될 폴더가 없으면 새로 생성한다.
		File fileUploadDir = new File(uploadPath);
		
		if(!fileUploadDir.exists()) {
			fileUploadDir.mkdir();
		}
		
		//파일이 아닌 일반 데이터는 getParameter()메서드나
		//getParameterValues()메서드를 이용해서 구한다.
		request.setCharacterEncoding("utf-8");
		String userName = request.getParameter("username");//jsp내임값이 서블릿에 들어온것
		System.out.println("일반 파라미터 데이터(username):" + userName);
		
		//-------------------
		String fileName = "";  //파일명이 저장될 변수 선언
		
		//한번에 여러 파일 업로드 후 보여줘야 되서 리스트 만들기
		List<fileVO> fileList = new ArrayList<fileVO>();
		
		/*
		 * 파트로 데이터를 구분해서 전송하는 전송방식이므로 
		 * 파트별로 처리할 수 있어야 한다
		 * 
		 * - Servlet 3.0이상에 새롭게 추가된 Upload용 메서드
		 *   1) request.getParts(); ==> 전체 Part객체가 저장된 컬렉션을 반환한다.
		 *   2) request.getPart("part이름") ==> 지정된 이름을 가진 part객체를 반환한다.
		 * 
		 * - 전체 파트를 가져다가 하나씩 검사하고 파일,일반 데이터를 구분하고 찾아낸 후
		 *   파일이면 파일에 대한 정보를 가져와야함
		 */
		for(Part part : request.getParts()) {//part에 저장되서 처리되는 구조
			//파일명 구하기
			fileName = extractFileName(part);
			
			//파일내임이 공백이면 
			//이것은 파일이 아닌 일반 파라미터라는 의미이다.
			if(!"".equals(fileName)) {
				//1개의 업로드 파일에 대한 정보를 저장할 객체 생성
				fileVO fileVo = new fileVO();
				
				fileVo.setFileName(fileName);
				fileVo.setFileSize((int)Math.ceil(part.getSize()/1024.0));
				
				try {
					//파일 저장 ==> Part객체의 write()메서드 이용
					part.write(uploadPath + File.separator + fileName);
					fileVo.setUploadStatus("Success");
					
				} catch (IOException e) {
				  fileVo.setUploadStatus("Fail : " + e.getMessage());
				}
				
				//처리된 파일 정보를 저장한 객체를 List에 추가
				fileList.add(fileVo);  
			}
			
		}//for문 끝...
		
		request.setAttribute("userName", userName);
		request.setAttribute("uploadFileList", fileList);
		
		RequestDispatcher rd =
				request.getRequestDispatcher("/fileupload/uploadFiles.jsp");
		rd.forward(request, response);
		
	}  //doPost()메서드 끝...

	/*
	 * - Part 구조
	 * 1) 파일이 아닐 때 (즉, 일반 파라미터 데이터일 경우)
	 * --------very132465897546     ==> 이상한 값 : Part를 구분하는 구분선
	 * content-disposition : form-data; name="username"  ==> 파라미터명
	 *                                         ==> 빈줄
	 * tester                                  ==> 파라미터 값
	 *   
	 * 2) 파일일 경우
	 * --------very132465897546     ==> 이상한 값 : Part를 구분하는 구분선
	 * content-disposition : form-data; name="uploadFile1"; filename="test1.txt"  ==> 파라미터명
	 * content-Type : text/plain    ==> 파일 종류
	 *                              ==> 빈줄
	 * abcd1234!@#$                 ==> 파일의 내용
	 */

	// Part영역에서 읽어올 '파일명'을 찾아 반환하는 메서드
	private String extractFileName(Part part) {
		String fileName = "";
		String contentDisposion = part.getHeader("content-disposition");
		//form-data; name="username" ==> 파일이 아닐때
		//form-data; name="uploadFile1"; filename="test1.txt" ==> 파일일때
		
		String[] items = contentDisposion.split(";");
		for(String item : items) {
			if(item.trim().startsWith("filename")) {
				//filename="test1.txt" ==> item변수값
				fileName = 
				    item.substring(item.indexOf("=")+2, item.length()-1);
			}
		}
		
		
		return fileName;
	}
	
}

좋은 웹페이지 즐겨찾기