javaboiii의 Web

Web - 파일 업로드 예제

javaboiii 2024. 8. 28. 22:44

WEB

파일 업로드는 클라이언트(사용자)가 자신의 로컬(본인의 PC나 폰)에서 파일을 선택해서 웹 서버로 전송하는 과정을 의미함. 이 파일은 서버에서 처리되며, 데이터베이스에 저장되거나 웹 페이지에서 사용됨

 

cos(Component Object Server) 라이브러리는 Apache Commons FileUpload의 파일 업로드 기능을 지원하기 위한 컴포넌트임. 이 라이브러리는 파일 업로드 요청을 처리하고 파일을 서버에 저장하는 기능을 제공함. COS는 파일 업로드를 쉽게 처리할 수 있도록 도와줌

 

jakarta.servlet의 @MultipartConfig 어노테이션을 이용해 이미지 파일을 처리

@MultipartConfig 어노테이션은 파일을 가지고 이동되는 경로(servlet 또는 Action)에 작성해 둬야함(파일 처리임을 표시)

 

파일 업로드 처리를 하려면 View 파트에서 form에 인코딩을 해야됨 - multipart/form-data

<form action="join.do" id="joinForm" method="POST" enctype="multipart/form-data">
<table border="1">
	<tr>
		<td>아이디</td><td><input type="text" required name="mid">&nbsp;<span id="checkMsg"></span></td>
	</tr>
	<tr>
		<td>비밀번호</td><td><input type="password" required name="password"></td>
	</tr>
	<tr>
		<td>비밀번호 확인</td><td><input type="password" required></td>
	</tr>
	<tr>
		<td>이름</td><td><input type="text" required name="name"></td>
	</tr>
	<tr>
		<td>프로필 이미지</td><td><input type="file" name="imagefile"></td>
	</tr>
	<tr>
		<td colspan="2" align="right"><input type="submit" value="회원가입"></td>
	</tr>
</table>
</form>

 

enctype="multipart/form-data": 이 속성은 파일 데이터를 포함한 폼 데이터를 서버로 전송할 때 필요

 

서블릿에서 이미지 파일을 업로드

package controller.member;

// 파일 처리에 필요한 클래스들을 가져옴
import java.io.File; // 파일 객체를 생성하고 다루기 위한 클래스
import java.io.FileOutputStream; // 파일에 데이터를 출력하기 위한 클래스
import java.io.InputStream; // 파일에서 데이터를 읽기 위한 클래스
import java.nio.file.Paths; // 파일 경로를 처리하기 위한 클래스

// 커스텀 액션 클래스와 포워드 클래스를 가져옴
import controller.common.Action; // 액션 인터페이스를 가져옵니다.
import controller.common.ActionForward; // 페이지 전환을 위한 클래스

// 서블릿 관련 클래스들을 가져옴
import jakarta.servlet.annotation.MultipartConfig; // 파일 업로드를 처리하기 위한 어노테이션
import jakarta.servlet.http.HttpServletRequest; // HTTP 요청을 다루기 위한 클래스
import jakarta.servlet.http.HttpServletResponse; // HTTP 응답을 다루기 위한 클래스
import jakarta.servlet.http.Part; // 파일 업로드를 위한 Part 클래스

// 데이터베이스 연동을 위한 DAO와 DTO 클래스를 가져옴
import model.dao.MemberDAO; // 데이터베이스와의 상호작용을 위한 DAO 클래스
import model.dto.MemberDTO; // 회원 정보를 저장하는 DTO 클래스

// 파일 업로드를 지원하는 설정을 위한 어노테이션(파일처리 경로에 작성해 둬야함(파일처리임을 알리기 위함)
@MultipartConfig
public class JoinAction implements Action {

	// 결합도를 낮추고 응집도를 높이며 하드코딩을 줄이기 위함
    // 기본 이미지 파일 경로
    private final static String DEFAULTIMAGEPATH = "default.jpg";
    // 이미지 파일을 저장할 서버상의 절대경로
    private final static String PATH = "D:\\workspace02\\src\\main\\webapp\\images\\";

    @Override
    public ActionForward execute(HttpServletRequest request, HttpServletResponse response) {
        // 폼에서 파라미터를 가져옴
        String mid = request.getParameter("mid");
        String password = request.getParameter("password");
        String name = request.getParameter("name");
        // 기본 이미지 경로를 설정
        String imagepath = DEFAULTIMAGEPATH;

        // 데이터베이스와의 상호작용을 위한 DAO 및 DTO 객체를 생성
        MemberDAO memberDAO = new MemberDAO();
        MemberDTO memberDTO = new MemberDTO();
        memberDTO.setMid(mid); // 회원 아이디 설정
        memberDTO.setPassword(password); // 비밀번호 설정
        memberDTO.setName(name); // 이름 설정
        memberDTO.setImagepath(imagepath); // 기본 이미지 경로 설정

        // 파일 업로드 처리를 위한 Part 객체를 선언
        Part file = null;
        try {
            // 클라이언트에서 전송한 파일 파라미터를 가져옴
            file = request.getPart("imagefile");
        } catch (Exception e) {
            // 예외 발생 시 스택 트레이스를 출력
            e.printStackTrace();
        }

        // 업로드된 파일의 이름을 추출
        imagepath = Paths.get(file.getSubmittedFileName()).getFileName().toString();
        if (!imagepath.isEmpty()) { // 사용자가 파일을 업로드한 경우
            System.out.println("로그 : 이미지 업로드 시작");

            // 파일을 저장할 경로와 파일 객체를 생성
            File uploadFile = new File(new File(PATH), imagepath);
            try (InputStream input = file.getInputStream(); // 파일에서 데이터를 읽기 위한 스트림
                 FileOutputStream output = new FileOutputStream(uploadFile)) { // 파일에 데이터를 쓰기 위한 스트림
                byte[] buffer = new byte[1024]; // 데이터 읽기 및 쓰기를 위한 버퍼
                int length;
                // 파일 데이터를 읽어와서 저장
                while ((length = input.read(buffer)) > 0) {
                    output.write(buffer, 0, length);
                }
            } catch (Exception e) {
                // 예외 발생 시 스택 트레이스를 출력
                e.printStackTrace();
            }

            // 업로드된 이미지의 경로를 DTO에 설정
            memberDTO.setImagepath(imagepath);

            System.out.println("로그 : 이미지 업로드 끝");
        }

        // 회원 정보를 데이터베이스에 삽입
        boolean flag = memberDAO.insert(memberDTO);

        // 페이지 전환을 위한 ActionForward 객체를 생성
        ActionForward forward = new ActionForward();
        forward.setRedirect(true); // 리다이렉트 설정
        // 회원 가입 성공 여부에 따라 이동할 경로를 설정
        if (flag) {
            forward.setPath("main.do"); // 성공 시 메인 페이지로 이동
        } else {
            forward.setPath("joinPage.do"); // 실패 시 가입 페이지로 이동
        }
        return forward; // 페이지 전환 정보를 반환
    }
}

 

Part : HTTP 요청에서 업로드된 파일이나 데이터의 정보를 담고 있는 객체

          파일 업로드의 중간 단계에서 파일과 데이터를 관리하는 객체

 

File : 파일 시스템에서 파일을 직접 다루는 데 사용되는 객체

         파일 객체 생성 File uploadFile = new File(new File(PATH), imagepath);는

         파일을 저장할 경로와 이름을 설정함

 

'javaboiii의 Web' 카테고리의 다른 글

Web - 리스너(Listener)  (0) 2024.09.02
Web - 8) 제이쿼리를 사용한 태그 제어와 Ajax  (0) 2024.08.30
Web - 비동기 처리) Ajax  (0) 2024.08.22
Web - Javascript) jQuery  (0) 2024.08.16
Web - Javascript  (0) 2024.08.14