게시판10) 파일 첨부

  • 이번 시간엔 write 시간에 쏙 빼놓고 다루지 않았던 파일 첨부에 대해 다루려고한다.!

    1203sp1

1. 디펜던시 & 라이브러리 추가

  • pom.xml

    <!-- 파일 업/다운을 위한 dependency 추가 -->
    <dependency>
    	<groupId>commons-io</groupId>
    	<artifactId>commons-io</artifactId>
    	<version>2.5</version>
    </dependency>
    <dependency>
    	<groupId>commons-fileupload</groupId>
    	<artifactId>commons-fileupload</artifactId>
    	<version>1.3.3</version>
    </dependency>
    
    
  • root-context.xml

    <!-- file upload를 위한 bean 설정 : 최대 10메가 -->
    <bean name="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760"></property>
    </bean>
    

2. form 에 enctype 추가

boardwrite.jsp

  • enctype = “multipart/form-data” 를 넣어줘야지 서버로 파일을 넘길 수 있다.
<form id ="" action ="boardwrite" method = "POST" enctype = "multipart/form-data">

    <td><input type= "file" name= "upload"></td>

</form>

3. jsp에서 받은 파일, 이름 변경해 저장

boardController

  • arg로 MultipartFile upload가 들어온다.

    public String boardWrite(Board board, MultipartFile upload,HttpSession session){}
    
  • 서버에 사용자가 올린 서버 디렉토리를 만들어준다.

    final String uploadPath = "/boardfile";
    File path = new File(uploadPath);
    //이건 완전 최초만 .
    if(!path.isDirectory()) {
        path.mkdirs();
    }
    
  • uuid는 랜덤하게 이상한 문자열을 생성해준다. 그걸로 original file의 이름을 바꿔 서버에 저장한다.(다른 사용자가 올린 같은 이름의 사진과 겹치지 않도록)

    String uid =UUID.randomUUID().toString();
    
  • uid 와 original file 이름을 조합해 saved file을 만든다.

    String filename ;
    String ext;
    String savedfile;
    // 마지막 .을 기준으로 오른쪽이 확장자명이다.
    int lastIndex = originalfile.lastIndexOf('.');
    //substring 을 이용해 . 왼쪽에 있는 파일명을 가져온다.
    filename=originalfile.substring(0,lastIndex);
    //확장자가 없으면, ext에 ""를 추가
    if(lastIndex==-1) {
        ext = "";
    }else {
        //확장자가 있는 경우 확장자를 .포함해 담아준다.
        ext = "."+originalfile.substring(lastIndex+1);
    }
    //조합!
    savedfile = filename +"_"+ uid + ext;
    
  • 전체코드

    @RequestMapping(value="/boardwrite" ,method=RequestMethod.POST)
    public String boardWrite(
        Board board,
        MultipartFile upload,
        HttpSession session) {
        final String uploadPath = "/boardfile";
        if(!upload.isEmpty()) {
            File path = new File(uploadPath);
            //이건 완전 최초만 .
            if(!path.isDirectory()) {
                path.mkdirs();
            }
            //파일의 진짜 이름
            String originalfile= upload.getOriginalFilename();
            //uuid
            String uid =UUID.randomUUID().toString();
            System.out.println(originalfile +","+uid);
    
            //파일의 저장이름
            String filename ;
            String ext;
            String savedfile;
            int lastIndex = originalfile.lastIndexOf('.');
            filename=originalfile.substring(0,lastIndex);
    
            //확장자가 없는 경우,
            if(lastIndex==-1) {
                ext = "";
            }else {
                //확장자가 있는 경우
                ext = "."+originalfile.substring(lastIndex+1);
            }
            savedfile = filename +"_"+ uid + ext;
            //파일 디스크에 저장하기
            File serverFile = new File(uploadPath +"/"+savedfile);
            //파일을 지정된 곳에 저장? 하게 해준다.
            try {
                upload.transferTo(serverFile);
            } catch (Exception e) {
                e.printStackTrace();
                originalfile = null;
                savedfile=null;
            }
    
            board.setOriginalfile(originalfile);
            board.setSavedfile(savedfile);
        }
    
        String userid = (String)session.getAttribute("loginId");
        board.setUserid(userid);
        System.out.println(board);
        repository.boardWrite(board);
        return "redirect:boardlist";
    }
    

boardMapper.xml

  • null일 경우 가져올 게 없으니까 가져오면 안된다.. 동적쿼리로 필요필요.

    <if test = "originalfile!=null and savedfile!=null">
        ,#{originalfile}
        ,#{savedfile}
    </if>
    
  • 전체 코드

    <insert id="boardRegist" parameterType = "Board">
        INSERT INTO board
        (
        boardseq,
        userid,
        title,
        message
        <if test = "originalfile!=null and savedfile!=null">
            , originalfile
            ,savedfile
        </if>
        )
        VALUES
        (
        board_seq.nextval
        ,#{userid}
        ,#{title}
        ,#{message}
        <if test = "originalfile!=null and savedfile!=null">
            ,#{originalfile}
            ,#{savedfile}
        </if>
        )
    

◇ Spring 게시판 포스팅 시리즈 ◇

  1. Spring 과 DB 연결하기
  2. 회원 가입 화면 구성
  3. ID 중복 확인 하기
  4. 로그인 페이지 만들기
  5. 게시판 화면 구성하기
  6. 글 쓰기 기능 구현
  7. 글 확인 기능 구현
  8. 글 수정 기능 구현
  9. 게시판 페이징
  10. 파일 첨부 기능 - 현재 글
  11. 파일 다운 기능
  12. MIME 타입
  13. 글 수정시 파일 변경

© 2018. All rights reserved.

Powered by Hydejack v8.5.2