Multipartfile
- Spring Framework에서 파일 업로드를 처리하기 위한 인터페이스
- HTML 폼에서 파일을 전송할 때 사용
주요 메서드
- getOriginalFilename(): 업로드된 파일의 원래 이름을 반환
- getSize(): 파일의 크기를 바이트 단위로 반환
- getContentType(): 파일의 MIME 타입을 반환
- isEmpty(): 파일이 비어 있는지 확인
- transferTo(File dest): 파일을 지정된 경로에 저장
실습 코드
<board.jsp>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>글 작성</title>
<script src="./js/preview.js"></script>
</head>
<body>
내용 ${data.content} <br>
작성자 ${data.writer} <br>
<hr>
<img id="defaultImage" alt="기본 이미지" src="./images/default.jpg" style="display:${empty data.path ? 'block' : 'none'};">
<c:if test="${not empty data.path}">
<img alt="비워두면 안됨" src="./images/${data.path}">
</c:if>
<form action="updateBoard.do" method="POST" enctype="multipart/form-data">
<input type="hidden" name="bid" value="${data.bid}">
이미지 <input type="file" name="file" onchange="preview(event)">
<br>
<img id="previewImage" style="display:none;margin:5px;" alt="미리보기 이미지"><br>
<input type="submit" value="이미지 변경">
</form>
<hr>
<a href="main.do">메인으로 이동</a>
</body>
</html>
<preview.js>
function preview(event) {
const file = event.target.files[0];
const reader = new FileReader();
reader.onload = function () {
const imgPreview = document.getElementById('previewImage');
imgPreview.src = reader.result;
imgPreview.style.display = 'block';
};
if(file) {
reader.readAsDataURL(file);
}
}
<BoardController.java>
package com.koreait.app.view.board;
import java.io.File;
import java.io.IOException;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.koreait.app.biz.board.BoardDTO;
import com.koreait.app.biz.board.BoardService;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
@Controller
public class BoardController {
@Autowired
private BoardService boardService;
private final String PATH = "D:\\kim1\\workspaceIJ\\day063_1010_01\\src\\main\\webapp\\images\\";
@RequestMapping(value="/boardList.do", method=RequestMethod.POST)
public @ResponseBody List<BoardDTO> boardList(@RequestBody BoardDTO boardDTO) {
System.out.println("com.koreait.app.view.board.value=boardList.do 실행");
System.out.println(boardDTO.getKeyword());
System.out.println(boardDTO.getCondition());
List<BoardDTO> datas=boardService.selectAll(boardDTO);
System.out.println("boardList.do selectAll datas = ["+datas+"]");
return datas;
}
@RequestMapping(value = "/board.do", method=RequestMethod.GET)
public String board(Model model, BoardDTO boardDTO) {
System.out.println("com.koreait.app.view.board.value=board.do 실행");
BoardDTO data=boardService.selectOne(boardDTO);
model.addAttribute("data", data);
System.out.println("board.do selectOne data = ["+data+"]");
return "board";
}
@RequestMapping(value = "/updateBoard.do", method=RequestMethod.POST)
public String updateBoard(BoardDTO boardDTO) throws IOException {
System.out.println("com.koreait.app.view.board.value=updateBoard.do 실행");
MultipartFile file = boardDTO.getFile();
String fileName = file.getOriginalFilename();
file.transferTo(new File(PATH+fileName));
boardDTO.setPath(fileName);
boardService.update(boardDTO);
return "redirect:main.do";
}
@RequestMapping(value="/main.do", method=RequestMethod.GET)
public String main(BoardDTO boardDTO, Model model) {
System.out.println("com.koreait.app.view.board.value=main.do 실행");
boardDTO.setCondition("ALL");
List<BoardDTO> datas=boardService.selectAll(boardDTO);
model.addAttribute("datas", datas);
return "main";
}
@RequestMapping(value="/insertBoard.do", method=RequestMethod.GET)
public String insertBoard() {
return "insertBoard";
}
@RequestMapping(value="/insertBoard.do", method=RequestMethod.POST)
public String insertBoard(BoardDTO boardDTO) {
System.out.println("com.koreait.app.view.board.value=insertBoard.do 실행");
boolean flag=boardService.insert(boardDTO);
System.out.println("insertBoard flag = ["+flag+"]");
return "redirect:main.do";
}
}
<BoardDAO2.java>
package com.koreait.app.biz.board;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
@Repository
public class BoardDAO2 {
private final String SELECTALL = "SELECT BOARD_NUM,BOARD_CONTENT,BOARD_WRITER_ID FROM BOARD";
private final String SEARCH_CONTENT = "SELECT BOARD_NUM, BOARD_CONTENT, BOARD_WRITER_ID \r\n"
+ "FROM BOARD \r\n"
+ "WHERE BOARD_CONTENT LIKE CONCAT('%', ?, '%')"; // 내용으로 검색
private final String SEARCH_WRITER = "SELECT BOARD_NUM,BOARD_CONTENT,BOARD_WRITER_ID FROM BOARD WHERE BOARD_WRITER_ID=?"; // 아이디로 검색
private final String SELECTONE = "SELECT BOARD_NUM,BOARD_CONTENT,BOARD_WRITER_ID,BOARD_LOCATION FROM BOARD WHERE BOARD_NUM=?";
private final String UPDATE = "UPDATE BOARD \n" +
"SET BOARD_LOCATION = ? \n" +
"WHERE BOARD_NUM = ?";
private final String INSERT = "INSERT INTO BOARD (BOARD_NUM,BOARD_CONTENT,BOARD_WRITER_ID) VALUES(?,?,?)";
@Autowired
private JdbcTemplate jdbcTemplate; // 스프링부트 내장객체
public List<BoardDTO> selectAll(BoardDTO boardDTO) {
String sql="";
if(boardDTO.getCondition().equals("SEARCH_CONTENT")&& boardDTO.getKeyword()!=null){
System.out.println("내용으로 검색~~~");
sql=SEARCH_CONTENT;
System.out.println("내용 검색어 = [ "+boardDTO.getKeyword()+" ]");
}
else if (boardDTO.getCondition().equals("SEARCH_WRITER")&& boardDTO.getKeyword()!=null) {
System.out.println("아이디로 검색~~~");
sql=SEARCH_WRITER;
System.out.println("아이디 검색어 = [ "+boardDTO.getKeyword()+" ]");
}
else if(boardDTO.getCondition().equals("ALL")) {
sql=SELECTALL; // 전체 검색
}
else {
System.err.println("사용자 입력 오류");
}
Object[] args= {boardDTO.getKeyword()};
if(sql.equals(SELECTALL) || sql.equals("")) {
return jdbcTemplate.query(sql, new BoardRowMapper());
}
else {
return jdbcTemplate.query(sql, args, new BoardRowMapper());
}
}
public BoardDTO selectOne(BoardDTO boardDTO) {
Object[] args= {boardDTO.getBid()};
return jdbcTemplate.queryForObject(SELECTONE,args,new BoardOneRowMapper());
}
public boolean insert(BoardDTO boardDTO) {
int result=jdbcTemplate.update(INSERT,boardDTO.getBid(),boardDTO.getContent(),boardDTO.getWriter());
if(result<=0) {
return false;
}
return true;
}
public boolean update(BoardDTO boardDTO) {
int result=jdbcTemplate.update(UPDATE,boardDTO.getPath(),boardDTO.getBid());
if(result<=0) {
return false;
}
return true;
}
public boolean delete(BoardDTO boardDTO) {
return true;
}
}
class BoardRowMapper implements RowMapper<BoardDTO> {
public BoardDTO mapRow(ResultSet rs, int rowNum) throws SQLException {
BoardDTO boardDTO=new BoardDTO();
boardDTO.setBid(rs.getInt("BOARD_NUM"));
boardDTO.setContent(rs.getString("BOARD_CONTENT"));
boardDTO.setWriter(rs.getString("BOARD_WRITER_ID"));
return boardDTO;
};
}
class BoardOneRowMapper implements RowMapper<BoardDTO> {
public BoardDTO mapRow(ResultSet rs, int rowNum) throws SQLException {
BoardDTO boardDTO=new BoardDTO();
boardDTO.setBid(rs.getInt("BOARD_NUM"));
boardDTO.setContent(rs.getString("BOARD_CONTENT"));
boardDTO.setWriter(rs.getString("BOARD_WRITER_ID"));
boardDTO.setPath(rs.getString("BOARD_LOCATION"));
return boardDTO;
};
}
2024.10.24
'Spring' 카테고리의 다른 글
| [Spring] 14. Mybatis (0) | 2024.11.04 |
|---|---|
| [Spring] 12. 트랜잭션 (0) | 2024.10.22 |
| [Spring] 11. DAO 고도화(템플릿 패턴) (0) | 2024.10.22 |
| [Spring] 10-1. AOP 어노테이션 (0) | 2024.10.17 |
| [Spring] 10. AOP(관점 지향 프로그래밍) (0) | 2024.10.16 |