우선 파일전송시 지켜야하는 규칙이 있다.
<form method = "post" enctype="multipart/form-data">
기본적으로 enctype = "application/x-www-form-urlencoded"이 default로 생략되어있다. 이 경우에 input (type="text")만 전송 한다면 요청파라미터의 문자열을 &로 구분해서 전송한다.
반면에 input(type="file")은 바이너리 데이터로 전송해야하고 보통 file만 전송하는 경우는 거의 없다.
따라서, file이 포함된 form 을 전송할 때 multipart를 사용하면 다른 데이터 타입을 구분해서 전송할수 있게 해준다.
-> http 요청에 각각의 content-type이 다르기 때문에 multipart가 두 종류의 데이터를 구분해서 하나의 요청body에 넣어준다.
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
<!--servlet-context.xml-->
<beans:bean id = "multipartResolver" class = "org.springframework.web.multipart.commons.CommonsMultipartResolver">
<beans:property name="maxUploadSize" value="10240000"/>
</beans:bean>
//Carcontroller.java
private HttpServletRequest request;
@Autowired
public CarController(HttpServletRequest request) {
this.request = request;
}
@GetMapping("/add")
public String requestAddCarForm() {return "addCar";}
@PostMapping("/add")
public String submitAddNewCar(@ModelAttribute CarDTO car) {
MultipartFile carimage = car.getCarimage();
String saveName = carimage.getOriginalFilename();
String realPath = request.getSession().getServletContext().getRealPath("/resources/images");
File saveFile = new File(realPath, saveName);
if(carimage != null && !carimage.isEmpty()) {
try {
carimage.transferTo(saveFile);
car.setCfilename(saveName);
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
carService.setNewCar(car);
return "redirect:/cars";
}
<!-- cars.jsp-->
<img src = "/resources/images/${car.cfilename}" style = "height : 200px">