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"> <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 |