본문 바로가기
Spring

[Spring] 13. 파일 입출력

by ssunooo 2024. 10. 24.

 

 

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