상세 컨텐츠

본문 제목

JSP 파일 업로드

FrontEnd/JSP (JavaServerPage)

by H_Develop 2022. 8. 25. 18:29

본문

프로젝트 생성

FileUp

 

WEB-INF > lib > cos.jar  파일 넣어주기.

 

UploadInput.html 파일 생성 (jsp로도 가능)

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script type="text/javascript">
	function send(f) {
    	var title = f.title.value.trim();
        var photo = f.photo.value.trim();
        if(title == "") {
        	alert("제목을 입력하세요");
            return;
        }
        if(photo == "") {
        	alert("파일을 선택하세요");
            return;
        }
        // FileUploadAction servlet
        f.action = "upload.do";
        f.submit();
    }	// send()
</script>
</head>
<body>
	<!-- 
    	파일 업로드 시, 고려사항
        1. 전송방식 : POST
        2. enctype = "multipart/form-data"
           enctype : 폼을 전송할 때, 사용할 인코딩 방법
    -->
    <form method="POST" enctype="multipart/form-data"> <!-- 공식으로 정해진 부분이다. -->
    	제목 : <input name = "title"><br>
        첨부 : <input type = "file" name = "photo"><br>
        <input type="button" value="업로드" onclick="send(this.form);">
	</form>
</body>
</html>

 

C 드라이브에 upload 폴더 생성

 

FileUploadAction 서블릿 파일 생성

 

package action;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotationi.WebServlet;
import javax.servlet.HttpServlet;
import javax.servlet.HttpServletRequest;
import javax.servlet.HttpServletResponse;
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

@WebServlet("/upload.do")	// .do:확장자, 확장자는 꼭 do로 하지않고 .abc도 가능하다.
public class FileUploadAction extends HttpServlet {
	private static final long serialVersionUID = 1L;
    protected void service(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
    	request.setCharacterEncoding("utf-8"); 
        String path="C:/upload";		// 아까 만들었던 업로드 폴더의 절대주소
        int max_size = 1024*1024*100;	// 100메가 라는 뜻, 버퍼메모리라 크게 잡아도 괜찮다.
        MultipartRequest mr = new MultipartRequest (
        	request, path, max_size, "utf-8", new DefaultFileRenamePolicy());
		// utf-8 수신 인코딩. DefaultFileRenamePolicy 동일 파일 명 있을 시, 다른 이름으로 해라
        RequestDispatcher disp = request.getRequestDispatcher("result.jsp");
        disp.forward(request, response);
	}
    protected void doGet (HttpServletRequest request, HttpServletResponse response)
    	throws ServletException, IOException {
		response.getWriter().append("Served at: ").append(request.getContextPath());
        }
        
}

 

서블릿 설정 시 추가하지 못했던 메서드, 또는 추가하고 싶은 메서드가 있을 때 편리한 방법

코드 부분 우클릭 > Source > Override / Implement Methods 에서 찾아서 넣으면 된다. 

 

FileUploadAction 서블릿 파일 내용 추가

 

String filename = "no_file";
	file f = mr.getFile("photo");
    if (f != null) {
    	filename = f.getName();
        System.out.println(filename);
    }
    String title = mr.getParameter("title");
    request.setAttribute("title", title);
    request.setAttribute("filename", filename);

위 내용 추가 아래 결과

package action;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotationi.WebServlet;
import javax.servlet.HttpServlet;
import javax.servlet.HttpServletRequest;
import javax.servlet.HttpServletResponse;
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

@WebServlet("/upload.do")	// .do:확장자, 확장자는 꼭 do로 하지않고 .abc도 가능하다.
public class FileUploadAction extends HttpServlet {
	private static final long serialVersionUID = 1L;
    protected void service(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
    	request.setCharacterEncoding("utf-8"); 
        String path="C:/upload";		// 아까 만들었던 업로드 폴더의 절대주소
        int max_size = 1024*1024*100;	// 100메가 라는 뜻, 버퍼메모리라 크게 잡아도 괜찮다.
        MultipartRequest mr = new MultipartRequest (
        	request, path, max_size, "utf-8", new DefaultFileRenamePolicy());
		// utf-8 수신 인코딩. DefaultFileRenamePolicy 동일 파일 명 있을 시, 다른 이름으로 해라
        String filename = "no_file";
		file f = mr.getFile("photo");
   		if (f != null) {
    		filename = f.getName();
        	System.out.println(filename);
    	}
    	String title = mr.getParameter("title");
    	request.setAttribute("title", title);
    	request.setAttribute("filename", filename);
        
        RequestDispatcher disp = request.getRequestDispatcher("result.jsp");
        disp.forward(request, response);
	}
    protected void doGet (HttpServletRequest request, HttpServletResponse response)
    	throws ServletException, IOException {
		response.getWriter().append("Served at: ").append(request.getContextPath());
        }
        
}

 

 

result.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
	제목 : ${requestScope.title} <br>
    <!-- 실제 이미지는 c드라이브에 저장되어 있으나, 
    <img>는 웹 경로상(webContent)의 이미지만 가져올 수 있다. 
    따라서 현재는 이미지를 불러올 수 없다.-->
	<img src="${filename}" width="200">
</body>
</html>

 

FileUploadAction 클래스 내용 수정

 

package action;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotationi.WebServlet;
import javax.servlet.HttpServlet;
import javax.servlet.HttpServletRequest;
import javax.servlet.HttpServletResponse;
import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

@WebServlet("/upload.do")	// .do:확장자, 확장자는 꼭 do로 하지않고 .abc도 가능하다.
public class FileUploadAction extends HttpServlet {
	private static final long serialVersionUID = 1L;
    protected void service(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
    	request.setCharacterEncoding("utf-8"); 

		String path="C:/upload";		// 아까 만들었던 업로드 폴더의 절대주소
        int max_size = 1024*1024*100;	// 100메가 라는 뜻, 버퍼메모리라 크게 잡아도 괜찮다.
        MultipartRequest mr = new MultipartRequest (
        	request, path, max_size, "utf-8", new DefaultFileRenamePolicy());
		// utf-8 수신 인코딩. DefaultFileRenamePolicy 동일 파일 명 있을 시, 다른 이름으로 해라
 
 		String filename = "no_file";
		file f = mr.getFile("photo");
   		if (f != null) {
    		filename = f.getName();
        	System.out.println(filename);
    	}
        
        String web_path = "/upload";
        ServletContext application = request.getServletContext();
        String path = application.getRealPath(web_path);
        System.out.println(path);
        
    	String title = mr.getParameter("title");
    	request.setAttribute("title", title);
    	request.setAttribute("filename", filename);
        
        RequestDispatcher disp = request.getRequestDispatcher("result.jsp");
        disp.forward(request, response);
	}
    protected void doGet (HttpServletRequest request, HttpServletResponse response)
    	throws ServletException, IOException {
		response.getWriter().append("Served at: ").append(request.getContextPath());
        }
        
}

 

result.jsp 내용 수정

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
	제목 : ${requestScope.title} <br>
    <!-- 실제 이미지는 c드라이브에 저장되어 있으나, 
    <img>는 웹 경로상(webContent)의 이미지만 가져올 수 있다. 
    따라서 현재는 이미지를 불러올 수 없다.-->
	<img src="upload/${filename}" width="200">
</body>
</html>

관련글 더보기