pom.xml 에 추가해야 할 부분..
<!-- file upload 를 위해 추가로 필요함. spring mvc 가 내부적으로 사용. --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.2</version> </dependency> |
서블릿 설정파일에 추가할 부분... board-servlet.xml
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" p:maxUploadSize="104857600" p:maxInMemorySize="10485760" />
|
파일을 저장하기 위한 DB 테이블 생성..
create table board_file( file_id number primary key, board_id number not null, contentType varchar2(30) not null, fileSize number not null, fileName varchar2(50) not null, saveFileName varchar2(50) not null, constraint fk_board_id foreign key(board_id) references board(board_id) ON DELETE CASCADE ); |
파일을 저장하기 위해서는 Multipart/form-data를 이용해야 하므로, form을 아래와 같이 바꾼다.
<form method="post" action="write" enctype="multipart/form-data"> 제목 : <input type="text" name="title"> <br> <textarea name="content" cols="60" rows="6"></textarea> <br> <input type="file" name="image"/> <input type="submit" value="글 저장"> </form> |
controller 에서는
public String write(@ModelAttribute BoardDTO boardDTO, @RequestParam("image") MultipartFile imageFile, HttpSession session) throws Exception{ UserDTO user = (UserDTO)session.getAttribute("user"); // user가 로그인하지 않았다면 exception을 발생시킨다. 글쓰기는 반드시 로그인한 사용자만 사용할 수 있기 때문이다. if(user == null){ throw new RuntimeException("로그인 후에 이용해 주세요."); }else{ boardDTO.setUserID(user.getUserID()); }
// 파일을 저장하는 부분.
String saveDir = "c:/temp"; File saveDirFile = new File(saveDir); if(!saveDirFile.exists()){ // 디렉토리가 존재하지 않는다면. saveDirFile.mkdirs(); // 디렉토리를 생성한다. } String saveRealPath = ""; if(imageFile.getOriginalFilename() != null && !"".equals(imageFile.getOriginalFilename())){ String saveFileName = System.nanoTime() + "_" + Thread.currentThread().getId() + "_" + imageFile.getOriginalFilename() ; // 유일한 파일이름을 만들기 위하여 saveRealPath = saveDir + File.separator + saveFileName; try { imageFile.transferTo(new File(saveRealPath)); // 실제 파일을 저장한다. } catch (Exception e) { throw new RuntimeException("file save error : " + saveFileName + " : " + e); } BoardFileDTO boardFile = new BoardFileDTO(); boardFile.setContentType(imageFile.getContentType()); // 파일의 mimeType boardFile.setFileSize(imageFile.getSize()); // 파일의 크기 boardFile.setFileName(imageFile.getOriginalFilename()); // 파일의 실제 이름 boardFile.setSaveFileName(saveFileName); // 하드디스크에 저장된 실제 파일 이름. boardDTO.setBoardFile(boardFile); }
System.out.println(boardDTO); // TODO boardDTO를 데이터 베이스에 저장하는 코드를 아래에 작성한다. boardSercvice.addBoard(boardDTO);
return "redirect:/board/list"; } |
board의 글이 저장되고, 그 때 얻어온 Board_ID가 file테이블에 들어가야하므로.... Board를 입력하는 Mapping 파일 수정..
<insert id="addBoard" parameterType="Board" useGeneratedKeys="true" keyProperty="boardID"> <![CDATA[ insert into board(board_id, title, content,user_id,regdate) values ( board_seq.nextval, #{title}, #{content},#{userID},sysdate) ]]> <selectKey keyProperty="boardID" resultType="Integer" order="AFTER"> SELECT board_seq.currval FROM dual </selectKey> </insert> |
위 처럼 selectKey를 정의해주면, board객체의 id 값을 채워준다.
public int addBoard(BoardDTO board) throws RuntimeException { sqlSession.insert("addBoard", board); return board.getBoardID(); } |
public void addBoard(BoardDTO board) throws RuntimeException { int boardID = boardDAO.addBoard(board); board.getBoardFile().setBoardID(boardID); boardDAO.addBoardFile(board.getBoardFile()); }
|
Board를 입력하고, 입력하면서 얻어온 BoardID를 이용해서 BoardFile을 입력한다.
public int addBoardFile(BoardFileDTO boardFile) throws RuntimeException { return sqlSession.insert("addBoardFile",boardFile); } |
'프로그래밍 > spring' 카테고리의 다른 글
spring 플러그인 설치및 sts 설치 등등 (0) | 2016.06.15 |
---|---|
파일다운로드 (0) | 2015.11.17 |
spring_mabatis 설정 (0) | 2015.11.02 |
filter (0) | 2015.10.29 |
springMVC config (0) | 2015.10.28 |