μ΄λ²μλ κ²μνμ νμΌ μ λ‘λμ κ΄ν΄μ μμ±μ νκ² λ€. μ΄λ² κΈμ μ λ‘λλ§ λ€λ£¨κ³ νμΌ λ€μ΄λ‘λμ κ΄ν΄μλ λ 곡λΆλ₯Ό νκ³ μμ±μ νκ² λ€.
μ°μ λ€μμ 2κ°μ§κ° νμνλ€
mariaDBμ 컬λΌμ μΆκ°νκ² λ€.
filename : νμΌμ μ΄λ¦μ ν΄λΉνλ 컬λΌ
filePath : νμΌμ μ μ₯λ κ²½λ‘μ ν΄λΉνλ 컬λΌ
DBμ Tableμ μμ νμΌλ Entity λν μμ μ νκ² λ€.
Board
@Entity
@Data
public class Board extends TimeEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String title;
private String content;
private String author;
// νμΌ μ
λ‘λλ₯Ό μν νλ μΆκ°
private String filename;
private String filepath;
//μμ μ μν μμ±μ
public Board(String title, String content, String author) {
this.title = title;
this.content = content;
this.author = author;
}
//κΈ°λ³Έ μμ±μ μΆκ°!
public Board() {
}
}
DBμ ν
μ΄λΈμ filename, filepathλ₯Ό μΆκ°νκΈ°μ EntityμΈ Boardμλ private Strinf filename
, private String filepath
λ₯Ό μΆκ°νλ€.
EntityκΉμ§ μμ μ νμΌλ κ²μκΈ μμ± νμ΄μ§λ₯Ό μμ ν΄μ νμΌ μ λ‘λ λΆλΆμ λ§λ€μ΄μ£Όκ² λ€.
boardWrite.html
<body>
<div class="container">
<h1>κ²μκΈ μμ±</h1>
<form th:action="@{/board/write}" method="post" enctype="multipart/form-data"> <!--μΆκ°λ λΆλΆ-->
<div class="form-group">
<label for="title">μ λͺ©</label>
<input type="text" id="title" name="title" required>
</div>
<div class="form-group">
<label for="author">μμ±μ</label>
<input type="text" id="author" name="author" required>
</div>
<div class="form-group">
<label for="content">λ΄μ©</label>
<textarea id="content" name="content" rows="8" required></textarea>
</div>
<!--μλ‘ μΆκ°λ λΆλΆ-->
<input type="file" name="file">
<!---->
<button type="submit" class="btn">μμ± νκΈ°</button>
</form>
</div>
</body>
νμΌ μ
λ‘λλ₯Ό ν΄μ£ΌκΈ° μν΄μλ μμ±μ μΆκ°ν΄μ€μΌνλ€.
boardWriteμ formμ enctype="multipart/form-dataμ΄ μΆκ°λμλ€.
λν, μ
λ ₯μ°½μΈ <input type="file" name="file">
μΆκ°λμλ€. μ΄μ μ€νμ ν΄μ νμΈμ ν΄λ³΄μ.
κ²μκΈ μμ± νμ΄μ§
κ²μκΈ μμ± νμ΄μ§λ‘ μ€λ©΄ μ μ¬μ§ μ²λΌ νμΌμ μ νν μ μλ νκ·Έκ° μΆκ°λ κ²μ νμΈν μ μλ€.
κ·Έλ¬λ μμ§ νμΌμ μ νν΄μ μμ±μ ν΄λ DBμ μ μ₯λμ§ μκΈ° λλ¬Έμ μ½λλ₯Ό μΆκ°νκ³ μ
λ‘λν νμΌμ μ μ₯ν λλ ν 리λ₯Ό νλ λ§λ€κ² λ€.
resources/static/files
μ°μ νμΌμ μ μ₯ν λλ ν 리λ₯Ό νλ λ§λ€μ΄μ€λ€.
BoardService/save μμ μ
public Board save(Board board) {
return boardRepository.save(board);
}
BoardService/save μμ ν
public void save(Board board, MultipartFile file) throws Exception {
//μ μ₯ν κ²½λ‘λ₯Ό μ§μ
String projectPath = System.getProperty("user.dir") + "/src/main/resource/static/files";
// λλ€ μλ³μ μμ±
UUID uuid = UUID.randomUUID();
// uuid + _ + νμΌμ μλ μ΄λ¦
String fileName = uuid + "_" + file.getOriginalFilename();
//νμΌμ μμ±ν κ²μΈλ° κ²½λ‘λ projectPath, μ΄λ¦μ filenameλ‘ λ΄κΈ΄λ€λ λ»
File saveFile = new File(projectPath, fileName);
file.transferTo(saveFile);
board.setFilename(fileName); //DBμ filename μ μ₯
board.setFilepath("/files/" + fileName); //DBμ νμΌ μ μ₯ κ²½λ‘ μ μ₯
boardRepository.save(board)
}
κ²μκΈμ μμ±νλ μ½λμΈ save λ©μλμ MultipartFile file
맀κ°λ³μλ₯Ό μΆκ°νλ€. μ΄λ νμΌμ λ°λ μν μ νλ€.
μ΄λ μ£Όμν κ²μ΄ μλ€. μ μ₯ν κ²½λ‘λ₯Ό μ§μ ν λ μλμ°μ λ§₯μ κ²½μ° λ€λ₯Έ λΆλΆμ΄ μ‘΄μ¬νλ€.
"\\src\\main\\resource\\static\\files";
"/src/main/resource/static/files";
κ²μκΈ μμ± λ©μλμΈ save
λ 컨νΈλ‘€λ¬μ κ²μκΈ μμ μμλ μ¬μ©μ΄ λλ€. saveμ 맀κ°λ³μλ₯Ό μΆκ°νμΌλ 컨νΈλ‘€λ¬μ μμ λΆλΆλ μμ μ ν΄μ£Όκ² λ€.
BoardControll
@PostMapping("/board/write")
public String boardWrite(Board board, Model model, MultipartFile file)
throws Exception {
boardService.save(board, file);
model.addAttribute("message", "κΈ μμ±μ΄ μλ£λμμ΅λλ€.");
model.addAttribute("searchUrl", "/board/list");
return "message'
}
λ§€κ° λ³μ MultipartFile file
μ μΆκ°νλ€.
BoardService/update
public void update(Integer id, Board updateBoard, MultipartFile file)
throws Exception {
Board board = boardRepository.findById(id).get();
board.setTitle(updateBoard.getTitle());
board.setAuthor(updateBoard.getAuthor());
board.setContent(updateBoard.getContent());
save(board, file);
}
BoardController/postUpdate
@PostMapping("/board/post/update/{id}")
public String postUpdate(@PathVariable Integer id, Board board,
Model model, MultipartFile file) throws Exception {
boardService.update(id, board, file);
model.addAttribute("message", "κ²μκΈ μμ μ΄ μλ£λμμ΅λλ€.");
model.addAttribute("searchUrl", "/board/post/" + id);
return "message";
}
μμ μ΄ νμν νμΌμ λͺ¨λ μμ μ νλ€. μ΄μ μ€νμ ν΄μ κΈ°λ₯μ΄ μ λμνλμ§ νμΈν΄λ³΄μ.
κ²μκΈ μμ± νμ΄μ§
μ°μ 'νμΌ μ λ‘λ ν μ€νΈ' κΈμ μμ±νλ©° μλμ κ·μ¬μ΄ κ°μμ§ μ¬μ§μ 첨λΆνκ² λ€.
μ°μ μ μΌλ‘ DBμ μ μ μ₯μ΄ λμλμ§ νμΈμ ν΄λ³΄μ.
κ°μ₯ μλκ° λ°©κΈ μμ±ν κΈμΈλ° filenameκ³Ό filepath λ±μ΄ μ μ₯λ κ²μ΄ 보μΈλ€.
DBκΉμ§ νμΈμ νμΌλ μ΄μ files ν΄λλ₯Ό νμΈν΄λ³΄μ. κ²μκΈμ νμΌμ λͺ¨λ files ν΄λμ μ μ₯μ νκ³ λΆλ¬μ¨λ€.
files ν΄λλ₯Ό 보λ DBμ filenameκ³Ό μΌμΉνλ μ΄λ¦μ μ¬μ§ μ¬μ§μ΄ ν΄λμ μ‘΄μ¬νλ€.
λ§μ§λ§μΌλ‘ κ²μν μμΈ νμ΄μ§μμ νμΈμ ν΄λ³΄μ.
κ²μκΈ μμΈ νμ΄μ§
κ²μκΈ μμΈ νμ΄μ§μ΄λ€. νμΌ μ
λ‘λ κΈ°λ₯μ΄ μ μμ μΌλ‘ ꡬνμ΄ λμλ€λ©΄ 'μ¬μ§'μ ν΄λ¦νμ λ κ·μ¬μ΄ κ°μμ§κ° 보μ¬μΌνλ€. μ΄μ ν΄λ¦ ν΄λ³΄κ² λ€.
μ±κ³΅μ μΌλ‘ κ°μμ§ μ¬μ§μ΄ 보μΈλ€! νμΌ μ
λ‘λ κΈ°λ₯μ΄ μ μμ μΌλ‘ ꡬνλλ€.
μ¬λ¬λͺ¨λ‘ λΆμ‘±ν μ μ΄ λ§λ€.
νμΌ λ€μ΄λ‘λ κΈ°λ₯μ΄ μλ€.
μ¬μ§μ 보기 μν΄μλ μλ² μ¬μ€νμ΄ νμνλ€.
μ¬μ§μ ν΄λ¦ν΄μ 보λ κ²μ΄ μλ κ²μκΈ μμΈ νμ΄μ§μ 보μ΄κ³ μΆλ€.
μμ νμ΄μ§μμ μ¬μ§ μμ μ΄ λΆκ°νλ€.
μμ μ μ κ²μ²λΌ μμ§ λΆμ‘±ν κ²μ΄ λ§λ€. μ΄ λΆλΆλ€μ μ°¨ν νλνλ μμ ν κ³νμ΄λ€.
λ€μ κΈμ μμ νμ΄μ§μμ μ¬μ§ μμ μ΄ κ°λ₯νλλ‘ λ³κ²½νλ κΈμ μμ±νκ² μ΅λλ€. κΈμμ λΆμ‘±ν λΆλΆμ΄ λ§μ κ² κ°μ΅λλ€. λͺ¨λ μ§μ μ νμν©λλ€!!
λ μμΈν μ½λλ κΉνλΈλ₯Ό μ°Έκ³ ν΄μ£ΌμΈμ!
κΉνλΈ: https://github.com/pp8817/ToyProjectBoard