SpringMVC文件上传(三)异常栈处理
上一节中, 我们是处理了文件上传的格式不对时,错误提示。但是这一节我们要处理的是,一旦文件上传的在写出流或写出流出现问题,或是线程上出了问题的话,那么我们应该如何处理。
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文件上传(三)异常栈处理相关推荐
- SpringMvc文件上传和下载
最近博主在做SpringMvc文件上传和下载的功能实现,上网查了很多资料很多都不太符合理想,找啊找,终于找到一个可以用的,然后再此基础上,我加以改进,可以支持多文件上传,而且代码非常精简,大家可以看看 ...
- SpringMVC文件上传功能MultipartFile参数为空
最近简单实现了一个springmvc文件上传功能,点了上传按钮一直报空指针,问题解决了mark一下留作以后查阅,如有搜到这篇文章的仅供参考,先上主要代码.springmvc.xml配置如下: < ...
- SpringMVC——文件上传下载,异步请求和SSM整合
一,SpringMVC文件上传下载 1.1 同步 1.1.1 文件上传 第一步:定义上传表单 <form action="${pageContext.request.contextPa ...
- springmvc请路径参数,springmvc-json-ajax使用,springmvc文件上传,springmvc文件下载,springmvc拦截器(内容较多)
按照操作,绝对都可以实现,亲测.....(项目所有文件和目录结构全都放上去了) idea工具,创建maven项目 第一步: 放置各种配置文件: pom.xml <?xml version=&qu ...
- SpringMVC文件上传下载和拦截器
一.文件上传:文件上传是项目开发中最常用的功能.为了能上传文件,必须将表单的method设置为post,将enctype设置为multipart/form-data.只有在这种情况下,浏览器才会把用户 ...
- SpringMVC 文件上传及下载
文件下载 inline 访问资源时如果没有设置响应头Content-Disposition,浏览器默认按照inline进行处理 inline:能显示就显示,不能显示就下载 响应头 只需修改响应头Con ...
- SpringBoot(SpringMVC)文件上传下载
话说,springboot不是一个全新的框架,它只是将其它框架整合在一起,提供一个"开箱即用"的环境.此文,利用的正是SpringMVC的功能. 创建springboot项目:ht ...
- springmvc文件上传下载
在web开发中一般会有文件上传的操作 一般JavaWeb开发中文件上传使用的 Apache组织的Commons FileUpload组件 SpringMVC中使用 MultipartFile file ...
- springmvc文件上传出现空指针问题
如下是springmvc中代码 @RequestMapping(value = "releasePro")public String releasePro(@RequestPara ...
- Springmvc文件上传(servlet3.0)/下载(ssm)以及坑点
前言 (补充:再linux服务器上可能没用创建文件的权限,那就需要找到文件夹给权限,比如我的chmod -R 777 /home/tomcat/apache-tomcat-default/webapp ...
最新文章
- log4j日志记录级别是如何工作?
- 004:STM32启动文件详解及SystemInit函数分析(转)
- 附加数据库失败,无法升级数据库,因为它是只读的
- ThinkPHP3.2.3 字段映射/自动验证/自动完成
- Vue+Spring boot前后端响应流程总结
- HDU 5025:Saving Tang Monk(BFS + 状压)
- Spring MVC –揭秘了@RequestBody和@ResponseBody
- centos下php5.4.22连接mssql,IIS7.5配置php5.4.22链接sql2008(用PDO链接数据库)_PHP教程...
- 别再用代码开发了,整理了30套实用可视化大屏模板,无套路直接领
- python中getattr()的用法
- pygame游戏开发-简介
- 7-2 求最大值及其下标编程总结
- 整站php_小白同学的福利:PHP常见面试题(附答案)
- 如何在VirtualBox中安装win7虚拟机?
- 随机生成姓名,姓名生成器
- HBuilder封装APP集成推送功能
- 知识直播的“顶流”,正在被复制
- linux解决依赖性问题
- 用 CSS 实现 AirDrop 动效
- 关闭防火墙linux出错,linux关闭防火墙【应对办法】