SpringBoot 게시판 만들기

스프링부트(SpringBoot) 게시판 만들기9 - Multipart 파일 업로드

dev109 2017. 9. 2.
반응형

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(200not null,
fileOriName varchar(300not null,
fileurl varchar(500not 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";
    }

cs




11. 프로젝트 재실행 후 localhost:8080/insert 에 접속해서 파일 등록 후 db에 들어갔는지 확인~











12. 파일업로드 끝~~~~~~~

반응형

댓글

💲 추천 글