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"; //返回一个逻辑视图名  
    }  
}  

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

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时空恋旅人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值