上一节中, 我们是处理了文件上传的格式不对时,错误提示。但是这一节我们要处理的是,一旦文件上传的在写出流或写出流出现问题,或是线程上出了问题的话,那么我们应该如何处理。

1.处理IOException异常栈

查看我们自己的代码,我们可以看出,在文件上传时,很可能报出下面的错误:

1)        IOException:如果我们文件写入磁盘时发生了错误,那么将会报这个异常栈。

2)        MultipartException:这个异常栈应该是在我们正在上传文件时会出现,如,我们上传的文件太大。

很幸运,运用Spring的框架,我们可以很容易处理这些问题,我们处理的方法有下面的两个:

1)        在控制层的方法上注解@ExceptionHandker。

2)        在Servlet的容器内,使用全局的异常操作。

下面让我们用@ExceptionHandler的注解来处理IOException的异常栈。

 @ExceptionHandler(IOException.class)
public ModelAndView handleIOException(IOException exception) {
ModelAndView modelAndView = new ModelAndView("profile/
uploadPage");
modelAndView.addObject("error", exception.getMessage());
return modelAndView;
}

为了测试这个方法,我们先将onUpload的方法改变下面的。

 @RequestMapping(value = "/upload", method = RequestMethod.POST)
public String onUpload(MultipartFile file, RedirectAttributes
redirectAttrs, Model model) throws IOException {
throw new IOException("Some message");
}

之后,我们上传文件时,就可以看到下面的页面。

2.处理MultipartException异常栈

现在我们将要来处理MultipartException的异常栈,这个一般是发生服务上的,例如Tomcat服务器。这样的异常栈是我们所不能控制的。

我们需要有WebConfiguration的类中,添加EmbeddedServletContainerCustomizer的bean.

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
EmbeddedServletContainerCustomizer
embeddedServletContainerCustomizer = new
EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer
container) {
container.addErrorPages(new ErrorPage(MultipartException.
class, "/uploadError"));
}
};
return embeddedServletContainerCustomizer;
}

我们使用的JDK8所以我们可以将上面的代码简化为下面的形式。(如果出现错误,操作:shift+Alt+S 选择8)

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
EmbeddedServletContainerCustomizer
embeddedServletContainerCustomizer
= container -> container.addErrorPages(new
ErrorPage(MultipartException.class, "/uploadError"));
return embeddedServletContainerCustomizer;
}

最后,我们还可以进一步简化我们的代码,如下的形式。

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
return container -> container.addErrorPages(new
ErrorPage(MultipartException.class, "/uploadError"));
}

现在,我们需要在PictureUploadController中添加错误映射的路径。

 @RequestMapping("uploadError")
public ModelAndView onUploadError(HttpServletRequest request) {
ModelAndView modelAndView = new ModelAndView("uploadPage");
modelAndView.addObject("error", request.getAttribute(WebUtils.
ERROR_MESSAGE_ATTRIBUTE));
return modelAndView;
}

错误的页面包含了许多有趣的服务容器中的错误参数属性,有助于我们定位问题。

最后,我们上传一个大于 1MB的文件,将会看到下面的报错信息。

3.友好提示MultipartException异常栈

上面的提示信息对于开发者来说是非常有用的,可以让我们快速定位问题,但对于用户来说是没有任何作用的,而且提示的信息也不够简洁。所以我们需要对这样的结果作处理。这就要修改PictureUploadController类,下面是笔者修改好的代码。
 private final MessageSource messageSource;
@Autowired
public PictureUploadController(PictureUploadProperties
uploadProperties, MessageSource messageSource) {
picturesDir = uploadProperties.getUploadPath();
anonymousPicture = uploadProperties.getAnonymousPicture();
this.messageSource = messageSource;
}

同时我们相应的方法也要进行修改。

@ExceptionHandler(IOException.class)
public ModelAndView handleIOException(Locale locale) {
ModelAndView modelAndView = new ModelAndView("profile/
uploadPage");
modelAndView.addObject("error", messageSource.getMessage("upload.
io.exception", null, locale));
return modelAndView;
}
@RequestMapping("uploadError")
public ModelAndView onUploadError(Locale locale) {
ModelAndView modelAndView = new ModelAndView("profile/
uploadPage");
modelAndView.addObject("error", messageSource.getMessage("upload.
file.too.big", null, locale));
return modelAndView;
}
这里的英文信息配置已经在前面的学习中配置了,法语是:
upload.io.exception=Une erreur est survenue lors de l'envoi du
fichier. Veuillez réessayer.
upload.file.too.big=Votre fichier est trop gros.

4.总结

这一节中,我们已经学习了如何去处理IOException和MultipartException的异常栈。代码都是很简单,只是我们要考虑到用户界面的美观,所以不能直接将错误信息给视图层,需要我们作相应的处理。既然,我们的文件是可以上传了,那么,对于文件的显示又该如何实现呢?在下一节中,我们将会学习。

源码下载:git@github.com:owenwilliam/masterSpringMVC.git

SpringMVC文件上传(三)异常栈处理相关推荐

  1. SpringMvc文件上传和下载

    最近博主在做SpringMvc文件上传和下载的功能实现,上网查了很多资料很多都不太符合理想,找啊找,终于找到一个可以用的,然后再此基础上,我加以改进,可以支持多文件上传,而且代码非常精简,大家可以看看 ...

  2. SpringMVC文件上传功能MultipartFile参数为空

    最近简单实现了一个springmvc文件上传功能,点了上传按钮一直报空指针,问题解决了mark一下留作以后查阅,如有搜到这篇文章的仅供参考,先上主要代码.springmvc.xml配置如下: < ...

  3. SpringMVC——文件上传下载,异步请求和SSM整合

    一,SpringMVC文件上传下载 1.1 同步 1.1.1 文件上传 第一步:定义上传表单 <form action="${pageContext.request.contextPa ...

  4. springmvc请路径参数,springmvc-json-ajax使用,springmvc文件上传,springmvc文件下载,springmvc拦截器(内容较多)

    按照操作,绝对都可以实现,亲测.....(项目所有文件和目录结构全都放上去了) idea工具,创建maven项目 第一步: 放置各种配置文件: pom.xml <?xml version=&qu ...

  5. SpringMVC文件上传下载和拦截器

    一.文件上传:文件上传是项目开发中最常用的功能.为了能上传文件,必须将表单的method设置为post,将enctype设置为multipart/form-data.只有在这种情况下,浏览器才会把用户 ...

  6. SpringMVC 文件上传及下载

    文件下载 inline 访问资源时如果没有设置响应头Content-Disposition,浏览器默认按照inline进行处理 inline:能显示就显示,不能显示就下载 响应头 只需修改响应头Con ...

  7. SpringBoot(SpringMVC)文件上传下载

    话说,springboot不是一个全新的框架,它只是将其它框架整合在一起,提供一个"开箱即用"的环境.此文,利用的正是SpringMVC的功能. 创建springboot项目:ht ...

  8. springmvc文件上传下载

    在web开发中一般会有文件上传的操作 一般JavaWeb开发中文件上传使用的 Apache组织的Commons FileUpload组件 SpringMVC中使用 MultipartFile file ...

  9. springmvc文件上传出现空指针问题

    如下是springmvc中代码 @RequestMapping(value = "releasePro")public String releasePro(@RequestPara ...

  10. Springmvc文件上传(servlet3.0)/下载(ssm)以及坑点

    前言 (补充:再linux服务器上可能没用创建文件的权限,那就需要找到文件夹给权限,比如我的chmod -R 777 /home/tomcat/apache-tomcat-default/webapp ...

最新文章

  1. log4j日志记录级别是如何工作?
  2. 004:STM32启动文件详解及SystemInit函数分析(转)
  3. 附加数据库失败,无法升级数据库,因为它是只读的
  4. ThinkPHP3.2.3 字段映射/自动验证/自动完成
  5. Vue+Spring boot前后端响应流程总结
  6. HDU 5025:Saving Tang Monk(BFS + 状压)
  7. Spring MVC –揭秘了@RequestBody和@ResponseBody
  8. centos下php5.4.22连接mssql,IIS7.5配置php5.4.22链接sql2008(用PDO链接数据库)_PHP教程...
  9. 别再用代码开发了,整理了30套实用可视化大屏模板,无套路直接领
  10. python中getattr()的用法
  11. pygame游戏开发-简介
  12. 7-2 求最大值及其下标编程总结
  13. 整站php_小白同学的福利:PHP常见面试题(附答案)
  14. 如何在VirtualBox中安装win7虚拟机?
  15. 随机生成姓名,姓名生成器
  16. HBuilder封装APP集成推送功能
  17. 知识直播的“顶流”,正在被复制
  18. linux解决依赖性问题
  19. 用 CSS 实现 AirDrop 动效
  20. 关闭防火墙linux出错,linux关闭防火墙【应对办法】

热门文章

  1. 测试对于list的sort与sorted的效率
  2. traceroute tracert
  3. 值类型、引用类型 再次理解
  4. TensorFlow 2.0源码编译步骤
  5. 游戏筑基开发之回调函数(C语言)
  6. Qos拥塞避免原理与实验
  7. Nginx安装的两种方法
  8. 关于最近开发小程序中踩过的那些坑
  9. 威胁情报工具:更快?更聪明?
  10. 这家保险公司的第三朵云为什么选择Power?