FileUploadController.java
package kr.or.ddit.controller.file.item01;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
import javax.annotation.Resource;
import javax.inject.Inject;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import kr.or.ddit.controller.file.item01.service.ItemService;
import kr.or.ddit.vo.Item;
import lombok.extern.slf4j.Slf4j;
@Controller
@RequestMapping("/item")
@Slf4j
public class FileUploadController01 {
/*
* - 파일 업로드 등록 기능 컨트롤러 메소드 만들기 (itemRegister:post)
* - 파일 업로드 등록 기능 서비스 인터페이스 메소드 만들기
* - 파일 업로드 등록 기능 서비스 클래스 메소드 만들기
* - 파일 업로드 등록 기능 Mapper 인터페이스 메소드 만들기
* - 파일 업로드 등록 기능 Mapper xml 쿼리 만들기
* - 파일 업로드 등록 완료 페이지 만들기.
* - 여기까지 확인
*/
// root-context.xml 에서 설정한 uploadPath 빈등록 path 경로를 사용한다.(value로 설정했던 값)
@Resource(name="uploadPath")
private String resourcesPath;
// private String uploadPath = "C://upload";
@Inject
private ItemService itemService;
**// 등록 페이지로 가는 메소드**
@RequestMapping(value="/register", method = RequestMethod.GET)
public String itemRegisterForm() {
return "item/register";
}
**// 파일 등록을 진행하는 메소드**
@RequestMapping(value="/register", method = RequestMethod.POST)
public String itemRegister(Item item, Model model) throws IOException {
MultipartFile file = item.getPicture();
log.info("originalName : " + file.getOriginalFilename());
log.info("size : " + file.getSize());
log.info("contentType : " + file.getContentType());
**// 넘겨받은 파일을 이용하여 파일 업로드(복사)를 진행한다.
// return : UUID + "_" _ 원본 파일명**
String createdFileName = uploadFile(file.getOriginalFilename(), file.getBytes());
item.setPictureUrl(createdFileName);
itemService.register(item);
model.addAttribute("msg", "등록이 완료되었습니다");
return "item/success";
}
**// 업로드할 파일 생성**
private String uploadFile(String originalName, byte[] fileData) throws IOException {
System.out.println("resourcesPath : " + resourcesPath);
UUID uuid = UUID.randomUUID(); // UUID 파일명 생성 준비
String createdFileName = uuid.toString() + "_" + originalName; //UUID + "_" + 원본파일명
File file = new File(resourcesPath);
if(!file.exists()) {
file.mkdirs();
}
File target = new File(resourcesPath, createdFileName);
FileCopyUtils.copy(fileData, target); // 파일 복사
return createdFileName;
}
}
package kr.or.ddit.controller.file.item01.service;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import kr.or.ddit.vo.Item;
@Service
public class ItemServiceImpl implements ItemService {
@Inject
private ItemMapper mapper;
**// 파일 등록하는 서비스**
@Override
public void register(Item item) {
mapper.create(item);
}
}
package kr.or.ddit.mapper;
import kr.or.ddit.vo.Item;
public interface ItemMapper {
public void create(Item item);
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"<https://mybatis.org/dtd/mybatis-3-mapper.dtd>">
<mapper namespace="kr.or.ddit.mapper.ItemMapper">
**<!-- 파일 등록하는 쿼리 -->**
<insert id="create" parameterType="item">
insert into item(
item_id, item_name, price, description, picture_url
) values (
seq_item.nextval, #{itemName}, #{price}, #{description}, #{pictureUrl}
)
</insert>
</mapper>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>Register</h2>
<form method="post" action="/item/register" enctype="multipart/form-data">
<table>
<tr>
<td>상품명</td>
<td>
<input type="text" name="itemName" id="itemName">
</td>
</tr>
<tr>
<td>가격</td>
<td>
<input type="text" name="price" id="price">
</td>
</tr>
<tr>
<td>파일</td>
<td>
<input type="file" name="picture" id="picture">
</td>
</tr>
<tr>
<td>개요</td>
<td>
<textarea rows="10" cols="20" name="description"></textarea>
</td>
</tr>
</table>
<div>
<button type="submit" id="btnRegister">Register</button>
<button type="button" id="btnList" onclick="javascript:location.href='/item/list'">List</button>
</div>
</form>
</body>
<script type="text/javascript">
</script>
</html>
등록 페이지로 넘어갔을 때 화면이다.

내용을 작성하고 파일을 선택 후 등록 버튼을 누르면 DB에 잘 저장된 것을 볼 수 있다.

