본문 바로가기

개발/Framework

[Spring] Spring - 스프링에서 파일 첨부하기

1.  파일첨부를 위한 라이브러리 등록

- pom.xml에 dependency태그 작성  commons-fileupload / commons-fileupload

<!-- 파일 업로드를 위한 라이브러리 -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
</dependency>

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

 

 

2. 파일 첨부를 위한 객체 bean등록

- root-context.xml에 id속성으로 multipartResolver 객체 등록

<!-- 파일 업로드 관련 빈 등록 -->
<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver">
    <property name="maxUploadSize" value="100000000" />
    <property name="maxInMemorySize" value="100000000" />
</bean>

> maxUploadSize : 첨부파일 용량 제한

> maxInMemorySize : 디스크에 임시 파일을 생성하기 전에 메모리에 보관할수있는 최대 바이트크기

 

- MultipartFile 객체를 넘겨받음

// 게시글 작성
@RequestMapping("insert.bo")  // 첨부파일이 여러개라면? MutipartFile[] upfile (배열로 받을 수 있음)
public String insertBoard(Board b, MultipartFile upfile, HttpSession session, Model model) {

    // System.out.println(b);
    // System.out.println(upfile); 첨부파일이 선택O / 선택X 객체가 무조건 생성! (차이점은 filename에 원본명이 존재하는가, ""빈문자열 인가)

    // 전달된 파일이 있을 경우 => 파일명 수정 작업 후 서버 업로드
    // => 원본명, 서버에 업로드된 경로를 b에 이어서 담기(파일이 존재할 경우에만)

    // 케이스가 나뉨!
    // 넘어온 첨부파일이 없을 경우 b : 제목, 작성자, 내용
    // 넘어온 첨부파일이 있을 경우 b : 제목, 작성자, 내용 + 파일 원본명, 파일저장경로

    if (!upfile.getOriginalFilename().equals("")) { // getOriginalFileName == filename 필드의 값을 반환
        b.setOriginName(upfile.getOriginalFilename());
        b.setChangeName("resources/uploadFiles/" + saveFile(upfile, session));
        // 실제적인 작업은 메소드 호출을 통해 이루어짐
    }

    if(boardService.insertBoard(b) > 0) { // 성공 => 게시글 리스트 페이지
        // 포워딩 => boardListView.jsp / list 조회 불가능!!
        session.setAttribute("alertMsg", "게시글이 등록되었습니다.");
        return "redirect:list.bo";						
    } else { // 실패 => 에러페이지
        model.addAttribute("errorMsg", "게시글 작성 실패");
        return "common/errorPage";
    }

}

 

 

3. 서버에 이름을 바꾼 파일을 저장하고, 바꾼 이름을 반환하는 메소드 생성

// 실제 넘어온 파일의 이름을 변경해서 서버에 업로드
public String saveFile(MultipartFile upfile, HttpSession session) {

    // 파일명 수정 작업 후 서버에 업로드 시키기("image.png" => 20221238123123.png)
    String originName = upfile.getOriginalFilename();

    // "20221226104530"(년월일시분초)
    String currentTime = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
    // 12321 (5자리 랜덤값)
    int ranNum = (int)(Math.random() * 90000 + 10000);
    // 확장자 
    String ext = originName.substring(originName.lastIndexOf("."));
    // 변경된 파일명
    String changeName = currentTime + ranNum + ext;

    // 업로드 시키고자 하는 폴더의 물리적인 경로 알아내기
    String savePath = session.getServletContext().getRealPath("/resources/uploadFiles/");

    try {
        // transferTo : 실제로 파일을 서버에 업로드해주는 메소드
        upfile.transferTo(new File(savePath + changeName)); 								
    } catch (IOException e) { // 컴파일러가 체크 : checkedException
        e.printStackTrace();
    }	

    return changeName;
}