[Web] File Upload

게맛살맛게·2021년 12월 30일
0

Web

목록 보기
1/1

파일 업로드

클라이언트단(브라우저)에서 파일을 선택해서 서버에 전송하는 것

  • 웹 사용자가 전송하려는 파일을 선택할 수 있게
    <input type="file"> 태그를 <form> 태그 안에 사용한다.
  • 요청 방식은 반드시 POST여야 하며
    enctype="form-data"라는 속성을 추가로 사용해서 전송하려는 파일의 내용이 인코딩 되지 않은 상태로 전송되도록 구현
  • <form> 태그에 enctype=”form-data”을 설정한 경우에는 입력 폼에 사용자가 입력한 내용이 name=value&name=value… 형식으로 인코딩되어 전달되는 것이 아니고 여러 파티션(multipart)으로 나뉘어서 서버에 전송

• enctype : 서버로 보내지는 데이터의 형식을 지정한다. 종류는 세가지가 지원된다.
1. application/x-www-form-urlencoded
디폴트 값은 이거다. 서버로 전송되기 전에 url-encode 된다는 뜻이다.
2. mutipart/form-data
파일 받으면서 설정해준게 이 값인데 이미지나 파일을 서버로 전송할 경우 이 방식을 사용한다고
한다.
3. text/plain
인코딩을 하지 않은 문자 그대로의 상태를 전송한다는 의미이다.

<form> 태그를 구성하는 각각의 <input> 태그별로 그리고 업로드되는 파일별로 하나의 파트를 이루게 되며 각각의 파티션은 “------boundary ID”로구분된다. 이렇게 구성하는 Content-Type 을 multipart/form-data 라고 한다.

[ 파일업로드를 처리하는 서블릿 구현 ]

@MultipartConfig (location = "c:/Temp/uploadtest")
public class PartTestServlet extends HttpServlet { 
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
    					throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		Collection<Part> parts = request.getParts();
		for(Part part : parts) {
			String filename = part.getSubmittedFileName();
            		if (filename != null) {
                    		part.write(fileName); 
			} else {	// 다른 작업	}
		}
	}
}

@WebServlet("/part")
@MultipartConfig  
public class PartTestServlet extends HttpServlet {   
	private static final long serialVersionUID = 1L;
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	request.setCharacterEncoding("utf-8");
        Collection<Part> parts = request.getParts();
        System.out.println("========== 요청 받음 =========");
        System.out.println("요청 파라미터로 "+ parts.size() + "개의 파트가 전달됨...");
        for(Part part : parts) {        	
            System.out.print("name 값(<form>태그의 name 속성의 값 : ");
            System.out.println(part.getName());            
            System.out.println("[ 파트만의  헤더 정보 ] ");
            for(String headerName : part.getHeaderNames()) {
                System.out.print(headerName + " : ");
                System.out.println(part.getHeader(headerName));
            }
            System.out.println("값(컨텐트) 크기 : "+ part.getSize());
            String filename = part.getSubmittedFileName();
            if (filename != null)
            	System.out.println("파일명 : "+filename);
            System.out.println("------------------------------------");
        }        
    }
}
<!doctype html>
<html>
<head>
<meta charset="UTF-8" />
<title>File Upload Sample</title>
<style>
	input {
		margin : 5px;
	}
</style>
</head>
<body>
	<form action="/edu/part"  enctype="multipart/form-data" 
	                           method="post"> 
		<label>작성자 이름 :  <input type="text" name="myname" /> </label><br>
		<label>작성자  폰번호 : <input type="text" name="myphone" /> </label><br>
		<label>첨부 파일 :  <input type="file" name="myfile" multiple/></label><br>
		<input type="submit"	value="전송" />
	</form>
</body>
</html>
File Upload Sample 작성자 이름 :
작성자 폰번호 :
첨부 파일 :

결과

파일 저장

  • @MultipartConfig(location = "c:/Temp/uploadtest")
package base;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
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;

@WebServlet("/upload")
@MultipartConfig(location = "c:/Temp/uploadtest")		// 저장 위치
public class UploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		request.setCharacterEncoding("utf-8");
		String path = "c:/Temp/uploadtest";
		File isDir = new File(path);
		if (!isDir.isDirectory()) {		// 디렉토리 없으면 생성
			isDir.mkdirs();
		}
		Collection<Part> parts = request.getParts();
		for (Part part : parts) {
			String fileName = part.getSubmittedFileName();
			if (fileName != null) {
				part.write(System.currentTimeMillis()+"_"+fileName);	// write로 알아서 저장 (경로는 상위 MultipartConfig에 지정)
				out.print("업로드한 파일 이름: " + fileName + "<br>");
				out.print("크기: " + part.getSize() + "<br>");
			} else {
				String partName = part.getName();					// 네임 속성 추출
				String fieldValue = request.getParameter(partName);	// 네임 속성 데이터 추출
				out.print(partName + " : " + fieldValue + "<br>");
			}
		}
		out.close();
	}
}
profile
IT 기술블로그

0개의 댓글