본문 바로가기
Spring/JSP

[JSP] 파일전송

by JJH0100 2022. 11. 28.
728x90
반응형

1. 폼을 통해 파일을 전송하기 위해서는 method가 반드시 post 방식이어야한다. get 방식은 주소 창을 타고 넘어가기 때문에 255자 이하의 작은 용량만 전송가능하기 때문이다. 따라서 파일 같이 용량이 큰 경우에는 get 방식으로 전송이 불가능하기 때문에 post 방식을 사용해야 한다.

2. form태그에 enctype="multpart/form-data"를 추가해주어야 한다.

 

MultipartRequest 클래스 생성자

MultipartRequest (
    javax.servlet.http.HttpServletRequest request,
    java.lang.String saveDirectory,
    int maxPostSize,
    java.lang.String encoding,
    FileRenamePolicy policy
)

 


EX01. uploadFile

upload.jsp

<%@ 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>
	<h2>파일 업로드</h2>
	<form action="upload.do" method="post" enctype="multipart/form-data">
		글쓴이  : <input type="text" name="name">	<br>
		제&nbsp;목  : <input type="text" name="title"> <br>
		파일지정  : <input type="file" name="uploadFile"> <br>
		<input type="submit" value="전송">
	</form>
</body>
</html>

UploadServlet.java

package com.lbi;

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("/upload.do")
public class UploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public UploadServlet() {
        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
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	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 savePath = "upload";
		//최대 업로드 파일 크기 지정
		int uploadFileSizeLimit = 5*1024*1024; //5MByte
		String encType = "UTF-8";
		ServletContext context = getServletContext();
		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");
			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) {
			System.out.println("예외발생 : " + e);
		}
	}

}

EX02. 다중 uploadFile

multiUpload.jsp

<%@ 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>
	<h2>다중 파일 업로드 하기</h2>
	<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>

 

MultiFileServlet.java

package com.lbi;

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 MultiFileServlet
 */
@WebServlet("/upload2.do")
public class MultiFileServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public MultiFileServlet() {
        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
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	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 savePath = "upload";
		int maxSize = 5*1024*1024;
		String encType="UTF-8";
		ServletContext context = getServletContext();
		String uploadFilePath = context.getRealPath(savePath);
		try {
			MultipartRequest multi = new MultipartRequest(request, uploadFilePath, maxSize, encType, new DefaultFileRenamePolicy());
			Enumeration files = multi.getFileNames();
			while(files.hasMoreElements()) {
				String file = (String)files.nextElement();
				String file_name = multi.getFilesystemName(file);
				
				//중복된 파일이 업로드 된 경우 파일명을 바꿈
				String ori_file_name = multi.getOriginalFileName(file);
				out.println("<br>업로드 된 파일명 : " + file_name);
				out.println("<br>원본 파일명 : " + file_name);
	            out.println("<hr>");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
728x90
반응형

'Spring > JSP' 카테고리의 다른 글

[JSP] JSTL <c:forEach>  (0) 2022.11.24
[JSP] JSTL <c:if>  (0) 2022.11.24
[JSP] JSTL - Core  (0) 2022.11.24
[JSP] JSTL 설치  (0) 2022.11.24
[JSP] 로그인 예제  (0) 2022.11.23

댓글