클라이언트단(브라우저)에서 파일을 선택해서 서버에 전송하는 것
<input type="file">
태그를 <form>
태그 안에 사용한다.<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();
}
}