File Upload

jinkyung·2021년 1월 26일
0

JSP

목록 보기
20/20

library 추가, temp와 upload폴더, MultipartTest.html생성

MultipartTest.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파일 업로드</title>
</head>
<body>
    <h3>파일 업로드 POST 요청 : Multipart 인코딩</h3>
    <p>입력폼의 method를 POST로 지정하고,
        enctype 속성의 값을 multipart/form-data로 설정
    </p>
    <form action="FileUploadServlet" method="post"
        enctype="multipart/form-data">
        사진: <input type="file" name="photo"><br>
        설명: <textarea name="description" cols="50" rows="3"></textarea><br>
        <input type="submit" value="추가"><br>
    </form>
</body>
</html>

FileUploadServlet

package lesson02.file;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;

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;

/*
/WEB-INF/temp 는 임시 폴더 (외부에서 접근 못하게 하기 위해 web-inf 안에 두었다.)
/upload는 모든 파일 정보를 수신하면 temp -> upload로 이동 
*/

@SuppressWarnings("serial")
@WebServlet("/FileUploadServlet")
public class FileUploadServlet extends HttpServlet{
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 응답데이터를 UTF-8로 해석하자
		req.setCharacterEncoding("UTF-8");
		// 전송데이터를 UTF-8로 해석하도록 하자
		resp.setContentType("text/html; charset=UTF-8");
		
		// 클라이언트와 연결된 통신객체
		PrintWriter out = resp.getWriter();
		out.println("<html><head><title>Multipart Test" +
					"</title></head><body>");
		
		try {
			String contextRootPath = 
					this.getServletContext().getRealPath("/");
			System.out.println("contextRootPath : " + contextRootPath);
			
			DiskFileItemFactory diskFactory = new DiskFileItemFactory();
			diskFactory.setRepository(
					new File(contextRootPath + "/WEB-INF/temp"));
			ServletFileUpload upload = new ServletFileUpload(diskFactory);
			
			@SuppressWarnings("unchecked")
			List<FileItem> items = upload.parseRequest(req);
			
			FileItem item = null;
			for(int i=0;i<items.size();i++) {
				item = items.get(i);
				if(item.isFormField())	// 일반 전달변수
					processFormField(out, item);
				else					// 업로드 파일
					processUploadFile(out, item, contextRootPath);
			}
			
//			List items = upload.parseRequest(req);
//			Iterator iterator = items.iterator();
//			FileItem item = null;
//			while(iterator.hasNext()) {
//				item = (FileItem)iterator.next();
//				if(item.isFormField())
//					processFormField(out, item);
//				else
//					processUploadFile(out, item, contextRootPath);
//			}
			
		}catch(Exception e) {
			out.println("<pre>");
			e.printStackTrace(out);
			out.println("</pre>");
		}
		
		out.println("</body></html>");
	}
	
	private void processUploadFile(
			PrintWriter out, FileItem item, String contextRootPath)
			throws Exception{
		
		String name = item.getFieldName();
		String fileName = item.getName();
		String contentType = item.getContentType();
		long fileSize = item.getSize();
		
		String uploadedFileName = System.currentTimeMillis() + 
					fileName.substring(fileName.lastIndexOf("."));
		File uploadedFile = new File(
				contextRootPath + "/upload/" + uploadedFileName);
		item.write(uploadedFile);
		
		// 클라이언트한테 정보보여주기
		out.println("<p>");
		out.println("파라미터 이름: " + name + "<br>");
		out.println("파일 이름: " + fileName + "<br>");
		out.println("콘텐츠 타입: " + contentType + "<br>");
		out.println("파일 크기: " + fileSize + "<br>");
		out.println("<img src='./upload/" + uploadedFileName
					+ "' width='500'><br>");
		out.println("</p>"); 
	}
	
	private void processFormField(PrintWriter out, FileItem item) 
		throws Exception{
		
		String name = item.getFieldName();
		String value = item.getString("UTF-8");
		
		out.println(name + ":" + value + "<br>");
	}
}

파일은 eclipse 안의 upload 폴더가 아니라 tomcat 안의 폴더에 올라가는 것이다.

/Users/jenna/Desktop/Programming/Servlet_JSP/lecture/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/_03_Http/upload

0개의 댓글