5. 도서 이미지를 등록하려면 BookController 컨트롤러에 submitAddNewBook()과 initBinder() 메서드를 수정해야 합니다.
코드 9-7 BookController.java
package com.springmvc.controller;
...
import java.io.File;
import org.springframework.web.multipart.MultipartFile;
@Controller
@RequestMapping("/books")
public class BookController {
...
@GetMapping("/add")
public String requestAddBookForm(@ModelAttribute("NewBook") Book book) {
return "addBook";
}
@PostMapping("/add")
public String submitAddNewBook(@ModelAttribute("NewBook") Book book) {
MultipartFile bookImage = book.getBookImage(); ➊
String saveName = bookImage.getOriginalFilename(); ➋
File saveFile = new File("C:\\upload", saveName);
if (bookImage != null && !bookImage.isEmpty()) {
try {
bookImage.transferTo(saveFile); ➌
} catch (Exception e) {
throw new RuntimeException("도서 이미지 업로드가 실패하였습니다", e);
}
}
bookService.setNewBook(book);
return "redirect:/books";
}
@ModelAttribute
public void addAttributes(Model model) {
model.addAttribute("addTitle", "신규 도서 등록");
}
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.setAllowedFields("bookId", "name", "unitPrice", "author", "description", "publisher", "category", "unitsInStock", "totalPages", "releaseDate", "condition", "bookImage"); ➍
}
}
➊ 신규 도서 등록 페이지에서 커맨드 객체의 매개변수 중 도서 이미지에 해당하는 매개변수를 MultipartFile 객체의 bookImage 변수로 전달합니다.
➋ MultipartFile 타입으로 전송받은 이미지 파일 이름을 얻습니다.
➌ 도서 이미지 파일을 C:\upload 경로로 업로드합니다.
➍ <form:input> 태그의 file 타입에서 name 속성 이름 bookImage에 바인딩되도록 bookImage를 추가로 설정합니다.