반응형

 

파일 첨부

 

멀티 파트 인코딩 방식을 이용하여 여러개의 파일을 첨부 및 전송한다.

=> form에  enctype="multipart/form-data" 를 이용 (생략 시 application/x-www-form-urlencoded로 기본 전송됨 => 파일 첨부 불가능)

 

 

 

아파치 자카르타 프로젝트의 fileupload 모듈을 이용한 파일업로드

 

 

upload2.html

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>File Upload 예제</title>
</head>

<body>
   <h3>아파치 자카르타 프로젝트의 fileupload 모듈을 이용한 파일업로드</h3>
    <form method="post" action="/ServletExam/upload.do" enctype="multipart/form-data">
        파일선택: <input type="file" name="uploadFile" multiple="multiple"/>
        전송자: <input type="text" name="sender">
        <input type="submit" value="Upload"/>

    </form>
    

    <br>
    <hr>

    <h3>서블릿3부터 지원하는 Part 인터페이스를 이용한 파일업로드</h3>
    <form method="post" action="upload3" enctype="multipart/form-data">
        파일선택: <input type="file" name="multiPartServlet"/>
        전송자: <input type="text" name="sender">
        <input type="submit" value="Upload"/>
    </form>
</body>
</html>

 

upload2.html 화면

 

전송자에 홍길동 입력 후 (아파치로 작동) upload 시 확인할 수 있음. multipart/form-data의 경우 형식 확인 가능

 

 

 

  • test

lib 추가

 

 

- 파일 위치 확인

파일 위치

 

 

T09UploadServlet.java

package kr.or.ddit.basic;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

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

/**
 * 자카르타 프로젝트의 fileupload 모듈을 이용한 파일 업로드 예제
 */
@WebServlet("/upload.do")
public class T09UploadServlet extends HttpServlet{
	private static final String UPLOAD_DIR = "upload_files";
	// 메모리 임계크기 (이 크기가 넘어가면 레파지토리 위치에 임시파일로 저장됨)
	private static final int MEMORIY_THRESHOLD = 1024 * 1024 * 3;
	// 파일 1개당 최대크기
	private static final long MAC_FILE_SIZE = 1024 * 1024 * 40;
	
	/* doGet으로는 전송 불가능
	 * @Override protected void doGet(HttpServletRequest req, HttpServletResponse
	 * resp) throws ServletException, IOException { }
	 */
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("================================================");
		
		BufferedReader br = new BufferedReader(
				new InputStreamReader(req.getInputStream()));
		String readLine = "";
		while((readLine = br.readLine()) != null) {
			System.out.println(readLine);
		}
		
		System.out.println("================================================");
	}
}

 

 

upload2.html

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>File Upload 예제</title>
</head>

<body>
   <h3>아파치 자카르타 프로젝트의 fileupload 모듈을 이용한 파일업로드</h3>
    <form method="post" action="/ServletTest/upload.do" enctype="multipart/form-data">
        파일선택: <input type="file" name="uploadFile" multiple="multiple"/>
        전송자: <input type="text" name="sender">
        <input type="submit" value="Upload"/>

    </form>
    

    <br>
    <hr>

    <h3>서블릿3부터 지원하는 Part 인터페이스를 이용한 파일업로드</h3>
    <form method="post" action="upload3" enctype="multipart/form-data">
        파일선택: <input type="file" name="multiPartServlet"/>
        전송자: <input type="text" name="sender">
        <input type="submit" value="Upload"/>
    </form>
</body>
</html>

 

파일 선택 후 Upload 클릭

 

결과 화면1-1

 

결과 화면1-2 : 하단에 깨진 내용은 파일 내용임

 

 

=> console 창 확인함 > Multipart Parsing 작업 진행

 

파일인 경우와 폼 데이터인 경우가 존재해 나눠서 파싱해야 함

 

 

 

T09UploadServlet.java

package kr.or.ddit.basic;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

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 org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;


/**
 * 자카르타 프로젝트의 fileupload 모듈을 이용한 파일 업로드 예제
 */
@WebServlet("/upload.do")
public class T09UploadServlet extends HttpServlet{
	private static final String UPLOAD_DIR = "upload_files";
	// 메모리 임계크기 (이 크기가 넘어가면 레파지토리 위치에 임시파일로 저장됨)
	private static final int MEMORIY_THRESHOLD = 1024 * 1024 * 3;
	// 파일 1개당 최대크기
	private static final long MAX_FILE_SIZE = 1024 * 1024 * 40;
	// 요청파일 최대크기
	private static final long MAX_REQUEST_SIZE = 1024 * 1024 * 50;
	
	/* doGet으로는 전송 불가능
	 * @Override protected void doGet(HttpServletRequest req, HttpServletResponse
	 * resp) throws ServletException, IOException { }
	 */
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		// Multipart Parsing 전에 파라미터 정보 조회해 보기
		System.out.println("Multipart Parsing 전 => " + req.getParameter("sender"));
		
		if(ServletFileUpload.isMultipartContent(req)) {
			
			// 폼필드 데이터 저장용
			Map<String, String> formMap = new HashMap<String, String>();
			
			DiskFileItemFactory factory = new DiskFileItemFactory();
			factory.setSizeThreshold(MEMORIY_THRESHOLD);
			factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
			
			ServletFileUpload upload = new ServletFileUpload(factory);
			upload.setFileSizeMax(MAX_FILE_SIZE);
			upload.setSizeMax(MAX_REQUEST_SIZE);
			
			String uploadPath = "d:/D_Other/" + UPLOAD_DIR;
			File uploadDir = new File(uploadPath);
			if(!uploadDir.exists()) {
				uploadDir.mkdir();
			}
			
			try {
				List<FileItem> fileItemList = upload.parseRequest(req);
				
				if(fileItemList != null && fileItemList.size() > 0) {
					for (FileItem item : fileItemList) {
						if(!item.isFormField()) { // 파일인 경우
							String fileName = item.getName();
							String filePath = uploadPath + File.separator + fileName;
							File storeFile = new File(filePath); // write에는 파일 객체로 넣어야 하기에 File에 집어 넣음
							item.write(storeFile); // 업로드된 파일 저장하기
							
							System.out.println("파일 업로드 완료 => " + filePath);
						} else { // 폼 데이터인 경우
							formMap.put(item.getFieldName(), item.getString("UTF-8"));
						}
					}
				}
			} catch (Exception ex) {
				ex.printStackTrace();
			}
			
			// Multipart Parsing 후에 파라미터 정보 조회해 보기
			System.out.println("Multipart Parsing 후 => " + formMap.get("sender"));
			
			////////////////////////////////////////////////////
			
			resp.setCharacterEncoding("UTF-8");
			resp.setContentType("text/plain");
			
			PrintWriter out = resp.getWriter();
			
			for (Entry<String, String> entry : formMap.entrySet()) {
				out.println("파라미터명 : " + entry.getKey());
				out.println("파라미터값 : " + entry.getValue());
				
			}
		}
	}
}

 

업로드한 파일 및 전송자 기입 내용

 

결과 화면2-1 : 넣은 값과 파일 업로드 위치를 확인할 수 있음

 

결과 화면2-2 : 파일 확인됨

 

 

 

서블릿3부터 지원하는 Part 인터페이스를 이용한 파일업로드

 

 

upload2.html

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>File Upload 예제</title>
</head>

<body>
   <h3>아파치 자카르타 프로젝트의 fileupload 모듈을 이용한 파일업로드</h3>
    <form method="post" action="/ServletTest/upload.do" enctype="multipart/form-data">
        파일선택: <input type="file" name="uploadFile" multiple="multiple"/>
        전송자: <input type="text" name="sender">
        <input type="submit" value="Upload"/>

    </form>
    

    <br>
    <hr>

    <h3>서블릿3부터 지원하는 Part 인터페이스를 이용한 파일업로드</h3>
    <form method="post" action="/ServletTest/upload2.do" enctype="multipart/form-data">
        파일선택: <input type="file" name="multiPartServlet"/>
        전송자: <input type="text" name="sender">
        <input type="submit" value="Upload"/>
    </form>
</body>
</html>

 

 

T10UploadServlet.java

package kr.or.ddit.basic;

import java.io.File;
import java.io.IOException;

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;

/**
 * 서블릿 3부터 지원하는 Part 인터페이스를 이용한 파일 업로드 예제
 * @author PC-10
 *
 */
@MultipartConfig(maxFileSize = 1024*1024*40) //@MultipartConfig 설정 필수!
@WebServlet("/upload2.do")
public class T10UploadServlet extends HttpServlet{
	private static final String UPLOAD_DIR = "upload_files";
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		// Multipart Parsing 전에 파라미터 정보 조회해 보기
		System.out.println("Multipart Parsing 전 => " + req.getParameter("sender"));
		
		String uploadPath = "d:/D_Other/" + UPLOAD_DIR;
		File uploadDir = new File(uploadPath);
		if(!uploadDir.exists()) {
			uploadDir.mkdir();
		}
		
		try {
			String fileName = "";
			
			for (Part part : req.getParts()) {
				System.out.println("전송된 Part명 : " + part.getName()); // name 속성명
				
				fileName = part.getSubmittedFileName(); // 전송된 파일명
				
				if(fileName != null && !fileName.equals("")) {
					// 폼필드가 아니거나 파일명이 존재하는 경우... (첨부파일이 존재하는 경우...)
					
					part.write(uploadPath + File.separator + fileName); // 파일 저장
					
					System.out.println("파일 업로드 완료 => " 
							+ uploadPath + File.separator + fileName);
				}
			}
			
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
}

 

업로드 전 화면

 

업로드 후 화면

 

결과 화면3 : 인코딩 처리로 인해 Multipart Parsing 전이 한글깨짐이 일어남

 

 

fileupload 모듈과 달리 업로드 경로 관리가 필요함.

 

 

반응형