파일 업로드 405 error

freejia·2021년 10월 7일
0
post-thumbnail

뭐 하던 중이냐면

파일 업로드 할 form 화면을 만들고 (GET 메서드 이용),
파일을 업로드 할 POST 메서드 컨트롤러를 만들고 있던 중이었다.
파일을 선택하고 '업로드'버튼을 딱 눌렀는데 에러남.

원인 및 해결

아래 처럼 리소스 오타를 고쳐서 해결했다 🤣
앞으로 컨트롤러에서 URL 작성할 때 복붙하는 습관을 들이자.

    @GetMapping("/items/new") // 입력 폼 화면
    public String newItemForm(@ModelAttribute ItemForm form)
    
    @PostMapping("/items/new") // 입력 처리 ( 여기가 URL 틀렸었다.. )
	public String saveItem(@ModelAttribute ItemForm form,)

컨트롤러의 GET method, POST method 의 URI

에러 내용

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";
    }

    // 다운로드 링크

}

파일 등록 폼 html

여긴 문제가 없다.
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>
profile
코딩 리딩 라이딩💛

0개의 댓글