파일 업로드 할 form 화면을 만들고 (GET 메서드 이용),
파일을 업로드 할 POST 메서드 컨트롤러를 만들고 있던 중이었다.
파일을 선택하고 '업로드'버튼을 딱 눌렀는데 에러남.
아래 처럼 리소스 오타를 고쳐서 해결했다 🤣
앞으로 컨트롤러에서 URL 작성할 때 복붙하는 습관을 들이자.
@GetMapping("/items/new") // 입력 폼 화면
public String newItemForm(@ModelAttribute ItemForm form)
@PostMapping("/items/new") // 입력 처리 ( 여기가 URL 틀렸었다.. )
public String saveItem(@ModelAttribute ItemForm form,)
POST 메소드가 지원되지 않음
DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'POST' not supported]
@Controller
@RequiredArgsConstructor
public class ItemController {
private final ItemRepository itemRepository;
private final FileStore fileStore;
@GetMapping("/items/new") // 입력 폼 화면
public String newItemForm(@ModelAttribute ItemForm form){
return "item-form";
}
@PostMapping("/itmes/new") // 입력 처리 ( 여기가 URL 틀림!!! )
public String saveItem(@ModelAttribute ItemForm form, RedirectAttributes redirectAttributes) throws IOException {
// 파일 하나 저장
MultipartFile attachFile = form.getAttachFile();
UploadFile storeUploadFile = fileStore.storeFile(attachFile);
// 파일 여러개 저장
List<MultipartFile> imageFiles = form.getImageFiles();
List<UploadFile> storeImageFiles = fileStore.storeFiles(imageFiles);
// 데이터베이스에 저장
Item item = new Item();
item.setItemName(form.getItemName());
item.setAttachFile(storeUploadFile);
item.setImageFiles(storeImageFiles);
itemRepository.save(item);
redirectAttributes.addAttribute("itemId", item.getId());
return "redirect:/items/{itemId}"; // 상품 뷰로 리다이렉트
}
@GetMapping("/items/{id}") // 등록 결과
public String items(@PathVariable Long id, Model model){
Item item = itemRepository.findById(id);
model.addAttribute("item", item);
return "item-view";
}
// 다운로드 링크
}
여긴 문제가 없다.
action에 URL을 써주지 않아도 된다.
왜냐하면 GET으로 들어온 URL과 똑같은 URL로 POST method를 호출하는 것이기 때문이다.
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div class="container">
<div class="py-5 text-center">
<h2>상품 등록</h2> </div>
<form th:action method="post" enctype="multipart/form-data">
<ul>
<li>상품명 <input type="text" name="itemName"></li>
<li>첨부파일<input type="file" name="attachFile" ></li>
<!-- multiple="multiple" 을 넣으면 여러개 업로드 가능. -->
<li>이미지 파일들<input type="file" multiple="multiple" name="imageFiles" ></li>
</ul>
<input type="submit"/>
</form>
</div>
</body>
</html>