一、处理multipart形式的数据
- 配置multipart解析器
从Spring 3.1开始, Spring内置了两个MultipartResolver的实现供我们选择:
- CommonsMultipartResolver: 使用Jakarta Commons FileUpload解析multipart请求;
- StandardServletMultipartResolver: 依赖于Servlet 3.0对multipart请求的支持(始于Spring 3.1) 。
StandardServletMultipartResolver是最佳的选择,但是如果我们需要将应用部署到非Servlet 3.0的容器中, 那么就得需要替代的方案。 Spring内置了CommonsMultipartResolver, 可以作为StandardServletMultipartResolver的替代方案。(配置方式见p257)
使用StandardServletMultipartResolver:
声明为bean,添加到在Spring应用上下文中
@Bean
public MultipartResolver multipartResolver() throws IOException {
return new StandardServletMultipartResolver();
}
在Servlet中指定multipart的配置
使用Servlet初始化类
@Override protected void customizeRegistration(Dynamic registration) { registration.setMultipartConfig( new MultipartConfigElement("/tmp/spittr/uploads", 2097152, 4194304, 0)); }
使用web.xml
使用web.xml
-
处理multipart请求
在某个控制器方法参数上添加@RequestPart注解<form method="POST" th:object="${spitter}" enctype="multipart/form-data"> <label>Profile Picture</label>: <input type="file" name="profilePicture" accept="image/jpeg,image/png,image/gif" /> </form> //控制中有三种方式 //1. @RequestMapping(value="/register", method=POST) public String processRegistration( @RequestPart(value="profilePictures", required=false) byte[] fileBytes) throws IOException {} //2. @RequestMapping(value="/register", method=POST) public String processRegistration( @RequestPart(value="profilePictures", required=false) Part fileBytes) throws IOException {} //3. 使用MultipartFile 用在表单实体类中。 用在参数中: @RequestMapping(method=RequestMethod.POST) public String processUpload(@RequestPart("file") MultipartFile file) {}
三、处理异常
异常必须要以某种方式转换为响应。
Spring提供了多种方式将异常转换为响应:
- 特定的Spring异常将会自动映射为指定的HTTP状态码;
- 异常上可以添加@ResponseStatus注解, 从而将其映射为某一个HTTP状态码;
- 在方法上可以添加@ExceptionHandler注解, 使其用来处理异常。
- 处理异常的最简单方式就是将其映射到HTTP状态码上, 进而放到响应之中。
- 将异常映射为HTTP状态码
Spring提供了一种机制, 能够通过@ResponseStatus注解将异常映射为HTTP状态码。@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="Spittle Not Found") public class SpittleNotFoundException extends RuntimeException {}
- 编写异常处理的方法
// @ExceptionHandler注解标注的方法能处理同一个控制器中所有处理器方法所抛出的异常。 @ExceptionHandler(DuplicateSpittleException.class) public String handleNotFound() { return "error/duplicate"; }