게시판10) 파일 첨부
in Web Dev on Java Spring
이번 시간엔 write 시간에 쏙 빼놓고 다루지 않았던 파일 첨부에 대해 다루려고한다.!
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 게시판 포스팅 시리즈 ◇