Skip to content

2. Board Image Upload

minkyoung edited this page Mar 16, 2021 · 1 revision

보드 이미지 업로드

기존 java 웹 프로젝트에서는 사용자가 DB에 직접 이미지를 저장x

이미지를 저장하는 방법?

form에 담은 @ModelAttribute 에서 이미지를 MultipartFile 타입으로 받은 후 byte[]로 바꿔서 BoardDTO에 저장해주고, 이것을 BoardDAO의 BoardMapper의 addBoard()를 통해 최종적으로 DB에 저장해준다.

  • src/lifeShare/controller/BoardTemp.java
@RequestMapping(value = "/uploads")
	public String uploadBoard(@ModelAttribute Board board, MultipartHttpServletRequest req, HttpServletRequest request) {

		MultipartFile file = board.getImgFile();
		HttpSession session = request.getSession();
		Users user = (Users)session.getAttribute("loginOK");
		String uid= user.getId();
		if(uid==null)
			return "redirect:/board";
		else
			board.setUid(uid); //uid 넣기 
		System.out.println(board);
		byte[] img=null;
		if (!file.getOriginalFilename().isEmpty()) {
			try {
				img = board.getImgFile().getBytes();
				board.setImg(img);//이미지 넣기 
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		boardService.addBoard(board);
		return "redirect:/board";
	}

MyBatis는 @Mapper 클래스로 지정된 메소드와 xml을 매핑시켜주어서 바로 DB의 조작을 가능케 한다. resultMap의 이미지를 jdbcType="BLOB"로 설정하면 mybatis가 byte[] 타입을 자동적으로 mysql의 BLOB 타입으로 저장해준다.

  • resources/mybatis/mappers/BoardMapperTemp.xml
<resultMap id="boardMap" type="lifeShare.dto.Board">
  <id column="IMG" property="img" jdbcType="BLOB"/>
</resultMap>

<update id="updateBoard" parameterType="map">
	update BOARD set
	TITLE=#{title},
	STATE=#{state},
	BTYPE=#{BTYPE},
	CATEGORY=#{category},
	LOC=#{loc},
	LOC2=#{loc2},
	CONTENT=#{content},
	LIKES=#{likes},
	IMG=#{img}
	where BID=#{bid}
</update>

cf) 참고로, 많은 searching 결과 업로드하는 사진을 직접 Database에 저장하는 일은 비효율적이기 때문에 이미지의 정보만을 저장하는 경우가 많다고 한다.

Clone this wiki locally