Spring In Action--04(SpringMVC的文件上传)

目录

 

1.配置multipart解析器

2.处理multipart请求

3.异常处理


1.配置multipart解析器

  首先DispatcherServlet是处理所有的请求的,需要在DispatcherServlet配置一个multipart解析器,告诉DispatcherServlet该如何读取multipart请求。

 DispatcherServlet并没有实现任何解析multipart请求数据的功能,而是把该任务委托给了Spring的MulipartResolver的实现。

 Spring内置了两个MulipartResolver实现:

  CommonsMultipartResolver(Spring3.1之前)

  StandardServletMultipartResolver

  配置只需要要注入一个Bean就行:

其他的上传文件的限制不是在StandardServletMultipartResolver中配置,而是在Servlet中配置。如何配置DispatcherServlet,用我们之前讲的通过重载customizeRegistration()方法。

最大文件上传大小约为20M,整个multipart请求的最大容量接近40M,如果一个文件上传的大小到达了0就写入临时路径,意思就是全部写入临时路径。

2.处理multipart请求

  控制器处理multipart请求只需要加上@RequestPart注解就好,接收的就是一个byte的数组。这样是不好的,Spring提供了MultipartFile来接受,那么可以拿到文件的全部信息,并且可以通过transferTo()方法轻易保存。

3.异常处理

  web中是以请求相应的方法来处理请求,所以出现异常必须要讲异常转换为Servlet响应。

  Spring提供了多种方式将异常转换为响应:

  • 特定的Spring异常会转换为HTTP状态码
  • 异常上可以添加@ResponseSratus注解,从而将其映射为某一个HTTP状态码。
  • 在方法上添加@ExceptionHandler注解,使其用来处理异常。

 这样将异常转换为状态码,就不会抛出500,而是404.

@ResponseStatus(value = HttpStatus.NOT_FOUND,reason = "not found")
public class MyException extends RuntimeException {
}

但是如果我们还想要获得异常的处理的信息,那么就不得不自己编写处理异常的方法了。这个样整个Controller抛出的My..异常就都能被它处理。

  @ExceptionHandler(MyRuntimeException.class)
    public String handler() {
        return "error";
    }

为控制器编写控制器通知类:

@ControllerAdvice  
public class ControllerAdviceTest {  
  
    @ModelAttribute  
    public User newUser() {  
        System.out.println("============应用到所有@RequestMapping注解方法,在其执行之前把返回值放入Model");  
        return new User();  
    }  
  
    @InitBinder  
    public void initBinder(WebDataBinder binder) {  
        System.out.println("============应用到所有@RequestMapping注解方法,在其执行之前初始化数据绑定器");  
    }  
  
    @ExceptionHandler(UnauthenticatedException.class)  
    @ResponseStatus(HttpStatus.UNAUTHORIZED)  
    public String processUnauthenticatedException(NativeWebRequest request, UnauthenticatedException e) {  
        System.out.println("===========应用到所有@RequestMapping注解的方法,在其抛出UnauthenticatedException异常时执行");  
        return "viewName"; //返回一个逻辑视图名  
    }  
}  

重定向会让原始请求的数据消亡。

发布了217 篇原创文章 · 获赞 70 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/weixin_37650458/article/details/105001401