수업 내용/Spring

(62일차) 1월 19일

효자로 캉테 2022. 1. 19. 20:28

[파일 업로드] 

 

 

 

 

 

파일첨부 코드 작성 (writeContentPage.jsp)

<!-- 파일 전송일 때 : enctype="multipart/form-data" 꼭 설정해야 함, method는 항상 post 방식이여야 함  -->
<form action="./writeContentProcess" method="post" enctype="multipart/form-data">
  
    <input type="file" accept="image/*" multiple name="uploadFiles"><br>
    <input type="submit" value="작성완료">
</form>

 

 

 

파일첨부 코드 작성 (BoardController)

@RequestMapping("writeContentProcess")
public String writeContentProcess(BoardVo param , MultipartFile [] uploadFiles , HttpSession session) {

    ArrayList<BoardImageVo> boardImageVoList = new ArrayList<BoardImageVo>();


    String uploadFolder = "C:/uploadFolder/"; 

    // 파일 업로드
    if(uploadFiles != null) {

        for(MultipartFile uploadFile : uploadFiles) { 

            if(uploadFile.isEmpty()) {  // 파일 업로드를 안해도 for문 한바퀴는 돌으므로 파일이 비어있는 경우에 탈출시키는 코드
                continue;
            }

            // 날짜별 폴더 생성  ex) 2022/02/16/
            Date today = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd/");  // 날짜를 문자로, 문자를 날짜로
            String folderPath = sdf.format(today);

            File todayFolder = new File(uploadFolder + folderPath);

            if(!todayFolder.exists()) {
                todayFolder.mkdirs();
            }


            // 파일명을 중복되지 않게 저장해야 된다!!
            // 방법 : 랜덤 + 시간
            String fileName = "";
            UUID uuid = UUID.randomUUID();

            fileName += uuid.toString();

            long currentTime = System.currentTimeMillis();
            fileName += "_" + currentTime;

            // 확장자 추가
            String originalFileName = uploadFile.getOriginalFilename();
            String ext = originalFileName.substring(originalFileName.lastIndexOf("."));
            fileName += ext;

            try {
                uploadFile.transferTo(new File(uploadFolder + folderPath + fileName));  // transferTo 메소드는 서버쪽 컴퓨터에 업로드한 파일을 저장
            } catch(Exception e) {
                e.printStackTrace();
            }

            // 위 이미지 생성 반복문 돌 때 마다 BoardImageVo에 세팅하여 boardImageVoList에 삽입 => Service에 보냄 
            BoardImageVo boardImageVo = new BoardImageVo();
            boardImageVo.setImage_url(folderPath + fileName);
            boardImageVo.setImage_original_filename(originalFileName);
            boardImageVoList.add(boardImageVo);

        }
    }

    /* 파라미터 2개 값(title, content) + 세션에서 회원 번호 뽑아서 param 메모리에 세팅해서 3개 값 세팅 */		

    MemberVo sessionUser = (MemberVo) session.getAttribute("sessionUser"); /* MemberController => loginProcess에서 session.setAttribute("sessionUser", sessionUser) */
    int memberNo = sessionUser.getMember_no();
    param.setMember_no(memberNo);   /* 세션에서 회원 번호 뽑아서 param 변수에 세팅. 즉 param에는 3개 값 세팅됨 */

    boardService.writeContent(param, boardImageVoList);

    return "redirect:./mainPage";
}

 

 

 

파일첨부 코드 작성 (BoardService)

public void writeContent(BoardVo vo, ArrayList<BoardImageVo> boardImageVoList) {

    int boardNo = boardSQLMapper.createBoardPk();

    vo.setBoard_no(boardNo);
    boardSQLMapper.insertBoard(vo);

    for(BoardImageVo boardImageVo : boardImageVoList) {

        boardImageVo.setBoard_no(boardNo);
        boardSQLMapper.insertImage(boardImageVo);

    }
}



/* getBoard 메소드는 글보기 할 때 사용 */
public HashMap<String, Object> getBoard(int board_no, boolean isEscape) {   /* 리턴 타입이 ArrayList가 아니라 HashMap인 이유는 하나의 글의 boardVo와 MemberVo만 필요하므로*/

    BoardVo boardVo = boardSQLMapper.getBoardByNo(board_no);

    int memberNo = boardVo.getMember_no();
    MemberVo memberVo = memberSQLMapper.getMemberByNo(memberNo);

    // 게시글 번호로 이미지 리스트 가져와서 map에 주입
    ArrayList<BoardImageVo> boardImageVoList = boardSQLMapper.getImageListByBoardNo(board_no);

    HashMap<String,Object> map = new HashMap<String,Object>();
    map.put("memberVo", memberVo);
    map.put("boardVo", boardVo);
    map.put("boardImageVoList", boardImageVoList);

    return map;
}

 

 

 

파일첨부 코드 작성 (JSP)

// 게시판 글읽기 이미지 화면 
<c:forEach items="${data.boardImageVoList}" var="boardImageVo">
    <img src="/upload/${boardImageVo.image_url }"><br>
</c:forEach>

 

 

 

라이브러리 추가 (pom.xml)

<!-- 업로드용 파일 파서... -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
</dependency>

 

 

 

파일 업로드 관련 빈(bean) 추가 (servlet-context.xml)

<!-- ja: 파일 업로드 관련 추가 빈 -->
<beans:bean id="multipartResolver" 
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <beans:property name="maxUploadSize" value="100000000"></beans:property>
</beans:bean>

 

 

 

파일 업로드 관련 서버 설정 

 1. server.xml 코드 추가

<Context docBase="C:\uploadFolder" path="/upload" reloadable="false"/></Host>

 

 

 2. Web Modules 설정

 

 

 

절대경로와 상대경로

 

 

 


 

 

 

BoardImageVo (com.ja.finalproject.vo 폴더)