데이터의 전송의 방식에는 쿼리 스트링을 이용하는 get, 별도의 저장공간을 사용하는 post 방식이 있다.
단순한 값(로그인의 경우)의 경우 get, 보안이 요구되는 경우 post 방식을 사용하지만,
이미지나 다른 파일의 경우, 크기 때문에 url 뒤에 덧붙이는 쿼리스트링의 방식을 사용하는 get 방식은 사용할 수 없다.
jsp/servlet 에서 파일 업로드를 사용하기 위해서는 전용 라이브러리가 요구된다.
※사전 준비
1. 해당 링크에서 cos 파일 다운로드
2. 압축 해제 후 해당 파일에서 lib/cos 파일을 라이브러리 폴더에 복사
해당 라이브러리에서 사용할 클래스는 MultipartRequest 이다.
※파일 업로드를 위한 클래스 매개변수
MultipartRequest(request 객체, 업로드 경로(String), 업로드 파일 크기(int), 인코딩 방식(String), new DefaultFileRenamePolicy())DefaultFileRenamePolicy()
- 동일 파일 업로드 시 업로드 되는 파일의 이름의 뒤에 숫자를 더하게 설정함
ex) a1.jpg, a2.jpg, a3.jpg, ...
form 태그에서 file 업로드를 하기 위해선 추가 옵션이 필요하다.
파일을 저장하기 위한 input 태그 의 type의 값은 "file" 로 설정한다.
※실습 예제 1/2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="upload.do" method="post" enctype="multipart/form-data"> 글쓴이 : <input type="text" name="name"><br> 제 목 : <input type="text" name = "title"><br> 파일 지정하기 : <input type="file" name="uploadFile"><br> <input type="submit" value="전송"> </form> </body> </html> | cs |
- form 태그의 method 옵션은 post, enctype은 "multipart/form-data" 로 설정
- input 태그의 type은 file로 설정
※실습 예제 2/2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | package com.saeyan.controller; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletContext; 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 UploadServlet */ @WebServlet(name = "upload.do", urlPatterns = { "/upload.do" }) public class UploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); // 전달 받은 request 값의 UTF-8 인코딩 response.setContentType("text/html; charset=UTF-8"); // servlet 자체 파일의 html 출력 PrintWriter out = response.getWriter(); String savePath = "upload"; //업로드 파일 저장 디렉토리 int uploadFileSizeLimit = 5*1024*1024; //업로드 파일 최대 크기 String encType = "UTF-8"; //인코딩 방식 ServletContext context = getServletContext(); // context 객체 생성 String uploadFilePath = context.getRealPath(savePath); //업로드 디렉토리의 서버상 실제 위치 System.out.println("서버상의 실제 디렉토리 : "+uploadFilePath); try { MultipartRequest multi = new MultipartRequest(request, uploadFilePath, uploadFileSizeLimit, encType, new DefaultFileRenamePolicy());// <-- 실제 파일이 업로드 되는 시점 String fileName = multi.getFilesystemName("uploadFile"); //업로드한 file의 이름을 가져옴, jsp 파일의 input 태그의 file, name 값과 동일 if(fileName==null) { System.out.println("파일이 업로드 되지 않음"); }else{ out.println("<br> 글쓴이 : "+multi.getParameter("name")); out.println("<br> 제 목 : "+multi.getParameter("title")); out.println("<br> 파일명 : "+fileName); } }catch(Exception e) { e.printStackTrace(); } } } | cs |
- MultipartRequest 객체는 기존의 Request객체와 사용 방법이 유사하다.
※jsp 파일
파일 지정하기 : <input type="file" name="uploadFile"><br>
※servlet 파일
String fileName = multi.getFilesystemName("uploadFile");
- jsp 파일의 input 태그(file 업로드 용)의 name 값을 얻기 위해서는 MultipartRequest의 getFilesystemName() 메소드를 이용한다.
- 업로드 된 파일은 프로젝트 내부 디렉토리가 아니라 tomcat에 의해 프로젝트가 실행될 수 있도록 서버(tomcat)에 저장된 프로젝트의 설정해둔(upload 디렉토리) 디렉토리에 저장된다.
다수의 파일을 업로드 하기 위해서는 열거형(Enumeration) 을 쓸 필요가 있다.
※실습 예제 1/2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action = "upload2.do" method="post" enctype="multipart/form-data"> 1. 파일 지정하기 : <input type="file" name="uploadFile01"><br> 2. 파일 지정하기 : <input type="file" name="uploadFile02"><br> 3. 파일 지정하기 : <input type="file" name="uploadFile03"><br> <input type="submit" value="전송"> </form> </body> </html> | cs |
- 다수의 input 태그 사용 및 file 타입으로 설정
※실습 예제 2/2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | package com.saeyan.controller; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; import javax.servlet.ServletContext; 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 MultiUploadServlet */ @WebServlet(name = "upload2.do", urlPatterns = { "/upload2.do" }) public class MultiUploadServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); String save = "upload"; int uploadFileSizeLimit = 5 * 1024 * 1024; String enctype = "UTF-8"; ServletContext context = getServletContext(); String upLoadFilePath = context.getRealPath(save); try { MultipartRequest mul = new MultipartRequest(request, upLoadFilePath, uploadFileSizeLimit, enctype, new DefaultFileRenamePolicy()); //<-- 실제 파일 업로드 시점 Enumeration e = mul.getFileNames(); // form 태그의 input 태그-file 전송용 의 모든 이름을 가져옴 while(e.hasMoreElements()) { String file = (String)e.nextElement(); String file_name = mul.getFilesystemName(file); String ori_file_name = mul.getOriginalFileName(file); //중복 파일의 경우 파일 뒤쪽으로 이름이 붙으므로, 원본 파일의 이름을 확인하기 위함 out.print("<br>파일 명 : "+file_name); out.print("<br>원본 : "+ori_file_name); out.print("<hr>"); } }catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } } | cs |
※ MultipartRequest 메소드
- getFileNames() : 다수의 file 타입 input 태그의 다수의 name 값 반환
- getFilesystemName(String name) : 해당 태그의 이름과 동일한 업로드 된 파일의 이름 반환
- getOriginalFilename(String name) : 업로드 된 파일의 원본 파일의 이름 반환
※Enumeration 메소드
- hasMoreElements : 열거형의 커서가 가리키는 값이 null 값인지에 대한 여부 확인
- nextElement() : 다음 값으로 커서 이동
댓글
댓글 쓰기