반응형
오늘의 의문을 하나의 이미지로 표현하자면 이것이다...
책 등록 form에서 넘기는 값들이 모두 null로 넘어가고, 맨 뒤 파일도 null로 넘어간다는 점이다.
한참을 헤매다가 혹시 몰라 enctype="multipart/form-data"을 빼고, 파일 input도 제거해보았는데, 그건 잘 넘어갔다.
그제서야 불연듯이 깨달았다. 수문장(servlet-context.xml)에 CommonsMultipartResolver를 알리지 않았다는 것을...
이 분께서 하시는 말씀처럼 일반적으로 form태그는 application/x-www-form-urlencoded 타입으로 하나의 part로 넘어가는데, 파일을 사용하기 위해 multipart/form-data 타입을 사용하게 되면 여러 part로 구분되어 정보가 넘어가는 방식이 이전과 다르기 때문에 디스패처 서블릿(servlet-context.xml)에 이렇게 읽어줘야 한다고 알려야한다.
[regist.jsp]
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>도서 관리</title>
</head>
<body>
<!-- 코드작성 -->
<%@include file="/WEB-INF/views/include/header.jsp" %>
<table border="1" style="width:100%">
<form method="post" action="regist" enctype="multipart/form-data">
<tr><td>도서번호 <input type="text" name="isbn"></td></tr>
<tr><td>도서명 <input type="text" name="title"></td></tr>
<tr><td>저자 <input type="text" name="author"></td></tr>
<tr><td>가격 <input type="number" name="price"></td></tr>
<tr><td>이미지 <input type="file" name="file" accept="image/*"></td></tr>
<tr><td>설명 <input type="text" name="orgImg"></td></tr>
<input type="submit" value="등록">
<input type="reset" value="초기화">
</form>
<table>
</body>
</html>
때문에 이처럼 multipart/data-form을 쓰려면 아래처럼 CommonsMultipartResolver를 등록해야한다.
[servlet-context.xml]
<beans:bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<beans:property name="defaultEncoding" value="UTF-8"></beans:property>
</beans:bean>
[Controller.java]
@PostMapping("/regist")
public String doRegist(@ModelAttribute Book book, @RequestPart(required = false) MultipartFile file, Model model)
throws IllegalStateException, IOException {
if(file!=null && file.getSize()>0) {
//내가 이미지를 저장할 장소 구하기
Resource resource = resLoader.getResource("resources/upload");
book.setOrgImg(file.getOriginalFilename());//원래 파일명
book.setImg(System.currentTimeMillis()+"_"+file.getOriginalFilename());//중복 방지를 위한 새로운 파일명
file.transferTo(new File(resource.getFile(),book.getImg()));//새로운 이미지 이름으로 경로에 저장할 것이다.
}
model.addAttribute("book", book);
return "regist_result";
}
form에서 정보를 받아오면 이처럼 이미지 파일을 새로운 경로에 저장하고, 불러서 결과페이지에 보일 수 있는 것이다.
[regist_result.jsp]
<c:if test="${not empty book.img}"><td rowspan="5"><img src="resources/upload/${book.img}"></td></c:if>
이런식으로 저장된 파일을 결과창에 이미지로 보여줄 수 있다.
반응형