Multipart 파일 업로드
1. 라이브러리 추가(pom.xml)
1 2 3 4 5 6 7 8 9 10 11 12 | <!--Multipart File Up&Download --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.0</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.5</version> </dependency> | cs |
2.WEB-INF에 uploadFiles 폴더 생성(업로드한 파일이 들어갈 위치)
3. com.example.demo.board.domain 에 FileVO.java 생성 후 작성
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | package com.example.demo.board.domain; public class FileVO { private int fno; private int bno; private String fileName; //저장할 파일 private String fileOriName; //실제 파일 private String fileUrl; public int getFno() { return fno; } public void setFno(int fno) { this.fno = fno; } public int getBno() { return bno; } public void setBno(int bno) { this.bno = bno; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } public String getFileOriName() { return fileOriName; } public void setFileOriName(String fileOriName) { this.fileOriName = fileOriName; } public String getFileUrl() { return fileUrl; } public void setFileUrl(String fileUrl) { this.fileUrl = fileUrl; } } | cs |
4. com.example.demo.board.controller.BoardController 에서 insert 부분 수정
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | @RequestMapping("/insertProc") private String boardInsertProc(HttpServletRequest request, @RequestPart MultipartFile files) throws Exception{ BoardVO board = new BoardVO(); board.setSubject(request.getParameter("subject")); board.setContent(request.getParameter("content")); board.setWriter(request.getParameter("writer")); String sourceFileName = files.getOriginalFilename(); String sourceFileNameExtension = FilenameUtils.getExtension(sourceFileName).toLowerCase(); File destinationFile; String destinationFileName; String fileUrl = "uploadFiles 폴더 위치" do { destinationFileName = RandomStringUtils.randomAlphanumeric(32) + "." + sourceFileNameExtension; destinationFile = new File(fileUrl + destinationFileName); } while (destinationFile.exists()); destinationFile.getParentFile().mkdirs(); files.transferTo(destinationFile); mBoardService.boardInsertService(board); return "redirect:/list"; } | cs |
*uploadFiles 위치 확인 : uploadFiles 우클릭 - Properties - Resource - Location
*스프링부트에서 multipart 요청을 처리하려면 multipartConfingElement, multipartResolver 빈이 애플리케이션 컨텍스트에 존재해야 하는데 애플리케이션 시작 시 MultipartAutoConfiguration 클래스가 이 작업을 자동으로 수행해줍니다.
*MultipartFile.transferTo() 는 요청 시점의 임시 파일을 로컬 파일 시스템에 영구적으로 복사해줍니다. 단 한번만 실행되며 두번째 실행부터는 성공을 보장할 수 없습니다.
5. insert.jsp 수정
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert Form</title> </head> <body> <h2> 게시글 작성 </h2> <div class="container"> <form action="/insertProc" method="post" enctype="multipart/form-data"> <!-- 추가 --> <div class="form-group"> <label for="subject">제목</label> <input type="text" class="form-control" id="subject" name="subject" placeholder="제목을 입력하세요."> </div> <div class="form-group"> <label for="writer">작성자</label> <input type="text" class="form-control" id="writer" name="writer" placeholder="내용을 입력하세요."> </div> <div class="form-group"> <label for="content">내용</label> <textarea class="form-control" id="content" name="content" rows="3"></textarea> </div> <input type="file" name="files"> <!-- 추가 --> <button type="submit" class="btn btn-primary">작성</button> </form> </div> <%@ include file="bootstrap.jsp" %> </body> </html> | cs |
* 파일 업로드를 할 경우 http 요청시 헤더의 Content-Type을 multipart/form-data 이어야 하기때문에 form의 enctype을 추가
6. localhost:8080/insert 로 접속해서 파일이 제대로 업로드 되는지 확인~
* 우클릭해서 Refresh~
7. 어떤 글에 등록된 파일인지 확인하기 위해 file 정보를 담을 table을 생성해줍니다.
1 2 3 4 5 6 | create table files( fno int not null auto_increment primary key, bno int not null, filename varchar(200) not null, fileOriName varchar(300) not null, fileurl varchar(500) not null); | cs |
fno : file 번호
bno : 어떤 게시글에 있는 파일인지 확인 하기 위한 글번호
filename : 저장될 파일명
fileOriName : 원래 파일명
fileurl : 파일 위치
8. BoardMapper.xml boardInsert 수정 및 boardFile 추가
1 2 3 4 5 6 7 8 9 10 11 | <insert id="boardInsert" parameterType="com.example.demo.board.domain.BoardVO" useGeneratedKeys="true" keyProperty="idx"> INSERT INTO BOARD (BNO, SUBJECT,CONTENT,WRITER,REG_DATE) VALUES(#{bno},#{subject},#{content},#{writer},now()) </insert> <insert id="fileInsert" parameterType="com.example.demo.board.domain.FileVO"> INSERT INTO FILES (FNO, BNO, FILENAME, FILEORINAME FILEURL) VALUES (#{fno},#{bno},#{fileName},#{fileOriName},#{fileUrl}) </insert> | cs |
* useGeneratedKeys="true" keyProperty="idx"
시퀀스가 자동 증가인 경우 insert 후에 시퀀스 값을 리턴받을 경우에 설정해줍니다. 게시글 작성 시 게시글 번호가 파일DB에 등록되어야 하기때문에 시퀀스 값을 리턴받아서 파일DB에 등록~
9. BoardMapper.java 에 파일업로드 추가, BoardService.java에 파일업로드 추가
1 2 3 4 5 6 7 8 | // BoardMapper.java public int fileInsert(FileVO file) throws Exception; //BoardService.java public int fileInsertService(FileVO file) throws Exception{ return mBoardMapper.fileInsert(file); } | cs |
10. BoardController.java 수정
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | @RequestMapping("/insertProc") private String boardInsertProc(HttpServletRequest request, @RequestPart MultipartFile files) throws Exception{ BoardVO board = new BoardVO(); FileVO file = new FileVO(); board.setSubject(request.getParameter("subject")); board.setContent(request.getParameter("content")); board.setWriter(request.getParameter("writer")); if(files.isEmpty()){ //업로드할 파일이 없을 시 mBoardService.boardInsertService(board); //게시글 insert }else{ String fileName = files.getOriginalFilename(); String fileNameExtension = FilenameUtils.getExtension(fileName).toLowerCase(); File destinationFile; String destinationFileName; String fileUrl = "/Users/seowon/Documents/Workspace/MyProject/tistory/demo/src/main/webapp/WEB-INF/uploadFiles/"; do { destinationFileName = RandomStringUtils.randomAlphanumeric(32) + "." + fileNameExtension; destinationFile = new File(fileUrl+ destinationFileName); } while (destinationFile.exists()); destinationFile.getParentFile().mkdirs(); files.transferTo(destinationFile); mBoardService.boardInsertService(board); //게시글 insert file.setBno(board.getBno()); file.setFileName(destinationFileName); file.setFileOriName(fileName); file.setFileUrl(fileUrl); mBoardService.fileInsertService(file); //file insert } return "redirect:/list"; } |
11. 프로젝트 재실행 후 localhost:8080/insert 에 접속해서 파일 등록 후 db에 들어갔는지 확인~
12. 파일업로드 끝~~~~~~~
'SpringBoot 게시판 만들기' 카테고리의 다른 글
스프링부트(SpringBoot) 게시판 만들기11 - 부트스트랩 더 끼얹기1 (2) | 2017.09.05 |
---|---|
스프링부트(SpringBoot) 게시판 만들기10 - Multipart 파일 다운로드 (2) | 2017.09.05 |
스프링부트(SpringBoot) 게시판 만들기8 - 게시글 수정(update), 삭제(delete) (1) | 2017.08.20 |
스프링부트(SpringBoot) 게시판 만들기7 - 게시글 상세(detail) (0) | 2017.08.20 |
스프링부트(SpringBoot) 게시판 만들기6 - 게시글 목록(list) + jstl 태그 사용 (2) | 2017.08.20 |
댓글