본문 바로가기

개발자노트/웹

HTML - JSP - 파일 업로드 ( 이미지 )

파일을 업로드 할 페이지.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>

<form action="test.do" method="post" enctype="multipart/form-data">
									<!-- 이미지 자체를 보내려면 인코딩타입=멀티파트를 사용해야함 -->
	<input type="text" name="mid">
	<input type="file" name="file"> <!-- 왼쪽은 타입 오른쪽은 파라미터명 -->
	<input type="submit" value="확인">
	
</form>

<hr>

<img alt="확인" src="images/"${file} >
<!-- 이클립스엔 아직 파일이 들어온 것으로 읽지 못해서 eclips 안에 있는 images를 refresh 시켜주어야함 -->

</body>
</html>

파일들을 보내기 위해선 form에 encodingtype을 지정해주어야한다.

인코딩 타입은 enctype="multipart/form-data"  를 작성해주면 된다.

 

그 후 업로드 한 이미지를 출력하기 위해, EL 식으로 file을 읽으면 된다.

 

 

업로드를 진행,저장해주는 savlet코드 (Test.Java)

package test;

import java.io.IOException;
import java.util.Enumeration;

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;

@WebServlet("/test.do")
public class Test extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public Test() {
        super();
        // TODO Auto-generated constructor stub
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
        // 만약에 get으로 요청이 들어와도 post가 실행될 수 있도록 지정
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	 request.setCharacterEncoding("UTF-8"); // 현재 필터가 없어서 인코딩 설정을 직접해줌
	 
	 
	 String path="저장할 경로";// 사용자가 업로드한 파일을 어디에 저장할지
	 int maxSize=100000; // 최대사이즈를 지정할 수 있음 바이트단위
	 
	 MultipartRequest mr = new MultipartRequest(request,path,maxSize,"UTF-8",new DefaultFileRenamePolicy());
	 // 첫번째 인자로는 요청정보가 필요하고, 
	 // 2. path 정보가 필요함(사용자가 업로드 시도한 파일을 어디에 저장할지"
	 // 3. 최대크기
	 // 4. 인코딩형식
	 // 5. 복사 붙여넣기 했을 때 같은 느낌이라 마지막 RenamePolicy는 다시 작성해주는것
	 // ☆ 멀티파트 리퀘스트를 사용하여서 이미 request를 mr에 담아버려서 더이상 일반 reques로는 파라미터 정보를 볼 수 없다..
	 
	 // String mid=request.getParameter("mid");
	 // String file=request.getParameter("file");
	 // System.out.println("로그1 ["+mid+"]");
	 // System.out.println("로그2 ["+ file +"]");
	 
	 
	 // 멀티파트 리퀘스트에서 파라미터명 보는법
	 String mid=mr.getParameter("mid");
	 System.out.println("로그1 ["+mid+"]");
	 
	 Enumeration<?> file=mr.getFileNames(); 
	 if(file.hasMoreElements()) {
		 String paramName=(String)file.nextElement(); // 요청을 보낸 쪽의 파라미터명을 저장
		 System.out.println("파라미터명 ["+paramName+"]");
	 
		 String serverFileName=mr.getFilesystemName(paramName);
		 System.out.println("서버에 업로드 된 파일명 ["+serverFileName+"]");
		 request.getSession().setAttribute("file", serverFileName); // NewFile.jsp 에서 업로드 된 파일명을 EL식으로 사용할 수 있게 set해줌
		 
		 
		 String clientFileName=mr.getOriginalFileName(paramName);;
		 System.out.println("사용자가 업로드한 파일명 ["+clientFileName+"]");
		 
		 String fileType=mr.getContentType(paramName);
		 System.out.println("파일의 타입 ["+fileType+"]");
		 
		 long length= mr.getFile(paramName).length(); // 바이트 단위
		 System.out.println("파일의 크기 ["+length+"]");
	 }
	 
	 response.sendRedirect("NewFile.jsp");
	}

}

여기서 중요한 것은 , jsp 파일에서  요청을 Multipart로 보냈으니,

꺼내서 사용할 때에도 MultipartRequest에 대한 response를 해주어여 하기 때문에,

MultipartRequest 객체에 정보를 담아서 response 해주어야한다는 것.

 

또한 이것은 내부라이브러리가 아닌, 외부 라이브러리기 때문에 jar파일을 사용해야한다.

 

 

cos.jar
0.05MB

그리고 또한, 이 MultiPart객체에 대한 정보를 보기 위해선 mr.getXxx(); 로 MultipartRequest의 정보들을 볼 수 있는데, 

 

요청했을 당시의 파라미터 이름을 보기 위해선 Enumeration<?> file=mr.getFileNames();  와 같이 

Enumeration<?> 을 정의해야함 ( getFileNames()의 output 이 Enumeration<?> 이기 때문에 )

보기 위해선 (String)으로 형변환까지 해야함.

 

이러한 과정이 끝나면 다시 요청을 보낸 페이지로  response.sendRedirect("요청한페이지"); response 해주면 됨

'개발자노트 > ' 카테고리의 다른 글

Ajax 를 이용한 아이디 중복검사  (0) 2022.08.25
HTML - FrontController  (0) 2022.08.23
초기화 매개변수 (xml)  (0) 2022.08.18
트랜잭션 예제 - 은행 계좌이체 예제  (0) 2022.08.17
트랜잭션 transaction  (0) 2022.08.17