0. 총코드
더보기
package upload;
import java.io.File;
import java.io.IOException;
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 com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
/**
* Servlet implementation class TestUpload
*/
@WebServlet("/test/upload")
public class TestUpload extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public TestUpload() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
RequestDispatcher dis = request.getRequestDispatcher("/upload/form.jsp");
dis.forward(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
// 업로드 할 경로
// 웹에서 접근할 때는 /img/1.jpg 만 씀.
String path = "/Users/choeyeeun/Desktop/web_workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/webapps/img";
// 업로드 파일의 최대 크기
int size = 100 * 1024 * 1024; // 100M
// 업로드에 사용할 MultipartRequest 객체 생성
// param1: 요청객체
// param2: 업로드 경로
// param3: 파일 최대 크기
// param4: 인코딩
// param5: 파일명 중복됐을때 처리 방법
MultipartRequest multipart = new MultipartRequest(request, path, size, "euc-kr", new DefaultFileRenamePolicy());
//------------------------------- 필요에 따라 쓰세요 이미 업로드 끝남 ---------------------------------------------------------------
// 폼파라메터 읽기
String title = multipart.getParameter("title");
// 업로드된 파일의 원본 이름
String fname = multipart.getOriginalFileName("uploadfile");
// 업로드된 파일의 파일객체 반환
// File 클래스 = 파일의 정보를 가지고 있음. (파일명, 절대경로 등등)
File f = multipart.getFile("file"); // a.jpg의 정보 가져옴
// getName(): 파일명 반환
String ffname = f.getName();// 파일명
File dir = new File(path); // 디렉토리 정보 객체 생성
String[] flist = dir.list(); // .list() : 파일 목록을 String 형태로 가져옴. {"1.jpg","2.jpg"};
request.setAttribute("flist", flist);
RequestDispatcher dis = request.getRequestDispatcher("/upload/list.jsp");
dis.forward(request, response);
}
}
<!-- form.jsp -->
<h3>파일 업로드</h3>
<form action="${pageContext.request.contextPath}/test/upload" method="post" enctype="multipart/form-data">
제목:<input type="text" name="title"><br/>
파일:<input type="file" name="file">
<input type="submit" value="upload">
</form>
<form action="" method="" enctype="multipart/form-data">
1. 이미지 파일을 업로드 하려면 꼭!! form 태그에 enctype을 multipart로 해야 한다!!!!!!
<input type="file" name="file">
2. input type ="file" 은 파일을 업로드할 수 있다.
// TestUpload.java -- doPost()
String path = "/Users/ham/Desktop/web_workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/webapps/img";
3. 이미지 파일을 업로드할 경로를 설정해 String에 담아야 한다.
- 프로젝트의 .metadata 파일을 찾고 싶으면 commend + shift + . 을 누르면 숨겨진 파일은 뜬다. (맥북 유저 파이팅^^..~)
- 프로젝트 파일 > .metadata > .plugins > org.eclipse.wst.server.core > tmp0 > webapps 로 이동한 다음, 저장할 이미지 폴더를 만들어 주고 경로를 복사해 String path 에 담아준다.
-- 맥과 윈도우는 경로가 다르게 복사된다. (맥은 /, 윈도우는 \\) 주의!
// TestUpload.java -- doPost()
int size = 100 * 1024 * 1024; // 100M
4. 업로드 파일의 최대 크기를 정해서 int size에 담아준다.
// TestUpload.java -- doPost()
MultipartRequest multipart = new MultipartRequest(request, path, size, "euc-kr", new DefaultFileRenamePolicy());
MultipartRequest( 요청객체, 업로드 경로, 파일 최대 크기, 인코딩, 파일명 중복됐을 때 처리방법 )
5. 업로드에 사용할 MultipartRequest 객체를 생성한다.
- 여기까지 하면 파일 업로드는 끝났다.
- 이후는 선택적으로 필요한 코드를 넣는다.
// TestUpload.java -- doPost()
String title = multipart.getParameter("title");
String fname = multipart.getOriginalFileName("uploadfile");
multipart.getOriginalFileName("")
업로드 된 파일의 원본 이름을 읽어온다.
6-1. 폼파라메터값을 multipart로 읽어온다.
- 업로드한 파일을 이름만 읽어와 String에 담는다.
// TestUpload.java -- doPost()
File f = multipart.getFile("file");
String ffname = f.getName();
6-2. 파일의 정보를 받아와 이름을 읽는다.
- File 클래스는 파일명, 절대 경로 등 파일의 정보를 가지고 있는 클래스이다.
- multipart.getFile("")은 업로드된 파일 객체를 반환한다.
- getName() 은 파일명을 반환한다.
--- 즉, 업로드 한 파일의 정보를 File 클래스로 읽어와서 그 중 이름만 뽑아 String에 담는다.
// TestUpload.java -- doPost()
File dir = new File(path);
String[] flist = dir.list();
request.setAttribute("flist", flist);
6-3. 파일 디렉토리의 목록을 list에 담는다.
디렉토리(directory): 파일 또는 다른 디렉토리에 액세스할 때 필요한 정보만을 포함하는 하나의 고유한 파일 유형. 폴더.
- 지정한 경로의 디렉토리 정보 객체를 생성한다.
- .list() : 해당 디렉토리에 저장된 이미지파일 목록을 String 형태로 가져온다. --{"1.jpg", "2.jpg}
- 파일 목록을 배열에 담아 request에 담는다.
// TestUpload.java -- doPost()
RequestDispatcher dis = request.getRequestDispatcher("/upload/list.jsp");
dis.forward(request, response);
<!-- list.jsp -->
<c:forEach var="f" items="${flist }">
<img src="/img/${f }" style="width:200px;height:200px"><br/>
</c:forEach>
7. request에 담은 이미지파일을 뷰페이지에 보여준다.