FileUploadController.java
package kr.or.ddit.controller.file.item01;
import java.io.File;
import java.io.IOException;
import java.util.List;
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 {
/*
* 13장 파일업로드
*
* 1. 파일업로드 설명
*
* - 파일 업로드 등록 기능 컨트롤러 메소드 만들기 (itemRegister:post)
* - 파일 업로드 등록 기능 서비스 인터페이스 메소드 만들기
* - 파일 업로드 등록 기능 서비스 클래스 메소드 만들기
* - 파일 업로드 등록 기능 Mapper 인터페이스 메소드 만들기
* - 파일 업로드 등록 기능 Mapper xml 쿼리 만들기
* - 파일 업로드 등록 완료 페이지 만들기.
* - 여기까지 확인
*
* - 파일 업로드 목록 화면 컨트롤러 메소드 만들기 (itemList:post)
* - 파일 업로드 목록 화면 서비스 인터페이스 메소드 만들기
* - 파일 업로드 목록 화면 서비스 클래스 메소드 만들기
* - 파일 업로드 목록 화면 Mapper 인터페이스 메소드 만들기
* - 파일 업로드 목록 화면 Mapper xml 쿼리 만들기
* - 파일 업로드 목록 화면 만들기(item/list).
* - 여기까지 확인
*/
// 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;
}
**// 파일 목록 화면 이동 메소드**
@RequestMapping(value="/list", method = RequestMethod.GET)
public String itemList(Model model) {
List<Item> itemList = itemService.list();
model.addAttribute("itemList", itemList);
return "item/list";
}
}
package kr.or.ddit.controller.file.item01.service;
import java.util.List;
import javax.inject.Inject;
import org.springframework.stereotype.Service;
import kr.or.ddit.mapper.ItemMapper;
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);
}
@Override
public List<Item> list() {
return mapper.list();
}
}
package kr.or.ddit.mapper;
import java.util.List;
import kr.or.ddit.vo.Item;
public interface ItemMapper {
public void create(Item item);
public List<Item> list();
}
<?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>
<!-- 파일 목록 출력하는 쿼리 -->
<select id="list" resultType="item">
select
item_id, item_name, price, description, picture_url
from item
order by item_id desc
</select>
</mapper>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="<http://java.sun.com/jsp/jstl/core>" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>List</h2>
<a href="/item/register">상품 등록</a>
<table border="1">
<tr>
<th align="center" width="80">상품ID</th>
<th align="center" width="320">상품명</th>
<th align="center" width="100">가격</th>
<th align="center" width="80">편집</th>
<th align="center" width="80">제거</th>
</tr>
<c:choose>
<c:when test="${empty itemList }">
<tr>
<td colspan="5">조회하신 상품이 존재하지 않습니다</td>
</tr>
</c:when>
<c:otherwise>
<c:forEach items="${itemList }" var="item">
<tr>
<td>${item.itemId }</td>
<td>${item.itemName }</td>
<td>${item.price }</td>
<td>
<a href="/item/modify?itemId=${item.itemId}">상품편집</a>
</td>
<td>
<a href="/item/remove?itemId=${item.itemId}">상품삭제</a>
</td>
</tr>
</c:forEach>
</c:otherwise>
</c:choose>
</table>
</body>
</html>
localhost/item/list 를 요청하면 해당 리스트가 잘 출력되는 것을 확인할 수 있다.
