본문 바로가기

개발중/JavaServer Pages (JSP)

단일 파일 업로드

728x90
반응형

파일 업로드 할때 가장 필요한 것은

- form 의 enctype"multipart/form-data" 로 지정해주는 것이다

- inputtype 을 "file"

 

input type 의 file은 파일선택 이라는 버튼 형태로 나타난다. 

도데체 이 버튼은 지정해주지 않았지만 왜 나오는 건가 했는데 file 속성 덕이었구나

 

파일을 전송하는 폼을 만들자.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>[ 01_unpload.jsp ]</title>
</head>
<body>
	<form action="upload.do" method="post" enctype="multipart/form-data">
		글쓴이 :       <input type="text" name="name" > <br>
		제목 :        <input type="text" name="name" > <br>
		파일 지정하기 :  <input type="file" name="uploadFile"><br>
		<input type="submit" value="전송">
	</form>
</body>
</html>

 

찾아보기 버튼이 생겼다.

 

그리고 파일 전송에 사용되는 COS 라이브러리를 추가해줘야 한다.

 COS.jar 라이브러리의 com.oreily.servlet 패키지에 존재하며 파일을 직접적으로 담당하는 패키지는 MultipartRequest class 이다.

  • getParameterNames()
    • 폼에서 전송한 파라미터의 이름을  Enumeration 타입으로 받아온다
  • getParameterValues()
    • 폼에서 전송한 파라미터들을 배열로 받아온다
  • getParameter()
    • 객체에 있는 해당 파라미터의 값을 가져온다
  • getFileNames()
    • 파일을 여러개 업로드 할 경우 그 값들을  Enumeration 타입으로 리턴한다.
  • getFilesysteName()
    • 서버에 실제로 업로드된 파일의 이름을 의미한다
  • getOriginalFileName()
    • 클라이언트가 업로드한 파일의 원본 이름을 의미한다
  • getContentType()
    • 업로드 파일의 컨텐트 타입을 얻을 때 사용한다
  • getFile()
    • 서버에 업로드 된 파일의 정보를 객체로 얻어낼 때 사용한

업로드 된 파일을 저장할 사용자 디렉토리를 하나 생성해 두자

이름은 upload

파일 업로드를 하기 위해서 필요한 import

  • import com.oreilly.servlet.MultipartRequest;
  • import com.oreilly.servlet.multipart.DefultFileRenamePolicy;

MultipartRequest

new DefaltFilrRenamePolicy() 는 중복되는 파일이름을 위해 존재한다. 

b.bmp  파일을 업로드 했는데 다시 같은 파일을 업로드 하는 경우에는 b1.bmp 이름으로 파일 중복 처리를 해준다

 

 

이제 서블릿을 생성해주자

 

doPost 에다가 다시 정의를 했건만 모두 처음보는 내용이네

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		request.setCharacterEncoding("UTP-8");
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		
		String savePath = "upload";
		int uploadFileSizeLimit = 5*1024*1024;
		String encType = "UTP-8";
		
		ServletContext context = getServletContext();
		String uploadFilePath = context.getRealPath(savePath);
		
		System.out.print("서버상의 실제 디렉토리 : " + uploadFilePath );
		
		//doGet(request, response);
	}

 

 

하나씩 정리를 해보자.

 

String savePath = "upload"; 

=> 내가 아까 만든 폴더 이름, 여기에다가 다운로드 받아줘

 

int uploadFileSizeLimit = 5*1024*1024;

=> 최대 업로드 파일 크기 5MB 로 제한

 

ServletContext context = getServletContext();
String uploadFilePath = context.getRealPath(savePath);

=> 서버상의 실제 경로를 찾아낸다

 

자, 이번에는 매개인자가 다섯개나 존재하는 함수가 등장했다

		try {
				MultipartRequest multi = new MultipartRequest(
						request, 
						uploadFilePath, 
						uploadFileSizeLimit, 
						encType, 
						new DefaultFileRenamePolicy());
					
		}catch (Exception e) {
			// TODO: handle exception
		}

 

request

=> 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");	
	}

String fileName = multi.getFilesystemName("uploadFile")

=> fileName 변수에 업로드 된 파일의 이름 저장

     <input type="file" name="uploadFile">

      smulti.getFilesystemName("uploadFile");

 

 

if( fileName == null ) 

=> 파일 업로드 되지 않았을 때

 

else

=> 파일 업로드 성공

 

우아아아!!!!

 

01_unpload.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>[ 01_unpload.jsp ]</title>
</head>
<body>
	<form action="upload.do" method="post" enctype="multipart/form-data">
		글쓴이 :       <input type="text" name="name" > <br>
		제목 :        <input type="text" name="name" > <br>
		파일 지정하기 :  <input type="file" name="uploadFile"><br>
		<input type="submit" value="전송">
	</form>
</body>
</html>

 

upload.do

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;

@WebServlet("/upload.do")
public class UpdateServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public UpdateServlet() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	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;
		String encType = "UTF-8";
		
		ServletContext context = getServletContext();
		String uploadFilePath = context.getRealPath(savePath);
		
		System.out.print("서버상의 실제 디렉토리 : " + 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 );
		}
		
		//doGet(request, response);
	}

}

 

파일 업로드를 늘 어렵게만 생각했는데 해보니까 해볼만하네 >,< 짱씐난다. 이제 여러개 파일을 올려봐야듸

728x90
반응형

'개발중 > JavaServer Pages (JSP)' 카테고리의 다른 글

여러장 파일 업로드  (0) 2020.08.15
session Login  (0) 2020.08.15
파일 다운로드/ 선택  (0) 2020.08.14
화폐단위 표현  (0) 2020.08.14
Login  (0) 2020.08.14