Spring MVC 多文件上传大小限制及异常处理

Spring MVC  多文件上传大小限制及异常处理

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es)

本文遵循“署名-非商业用途-保持一致”创作公用协议

转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS、Android、Html5、Arduino、pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作。

在 spring mvc 的默认配置文件 WEB-INF/xxx-servlet.xml 中加入如下 bean 配置,

	<bean id="multipartResolver"
		class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="defaultEncoding">
			<value>UTF-8</value>
		</property>
		<property name="maxUploadSize">
		    <!-- 上传文件大小限制为31M,31*1024*1024 -->
			<value>32505856</value>
		</property>
		<property name="maxInMemorySize">
			<value>4096</value>
		</property>
	</bean>

那么当在 html 页面 form 中使用 martpart 的 文件上传组件 <input type="file" name="xxx"/>上传文件到 spring mvc 时,

如果某一个文件超出大小,则会抛出异常,使整个 WEB 应用崩溃,

如何能在自定义的控制器中捕获这一 spring mvc 框架级的异常呢?

我们还是看一下官方文档是怎么说的吧!

http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#mvc-exceptionhandlers-resolver

Spring HandlerExceptionResolver 接口的实现会处理控制器执行过程中发生的未捕获异常。HandlerExceptionResolver 稍许重组了你在 web 应用描述文件 web.xml 中定义的异常映射。然而,它们提供了更灵活的方式来做到这一点。例如,你来提供异常抛出来哪一个处理器被执行的相关信息。更进一步,编程方式处理异常给你更多的选择性以便在请求转向另一 URL 之前合理做出响应。(和你使用 Servlet 专有异常映射时一样的最终结果)

除了实现 HandlerExceptionResolver 接口外,唯一需要做的事情就是实现 resolveException(Exception, Handler) 方法并返回一个 ModelAndView,你也可以使用预先提供的 SimpleMappingExceptionResolver 或创建一个 @ExceptionHandler 方法。

下面贴出整个控制器的内容,

后三个方法分别是上传多文件处理、处理后结果呈现、还有文件大小超限异常处理。

第一个是通过 jsp 模板呈现页面并替换变量,这个其实很简单,可是好多方法处理后,都无法替换变量,包括重布署,清除重编译等等,甚至重建工程。

后来发现,好多问题并不是问题本身,而是该死的 Maven ,在配置了国内 Maven 镜像并购买的梯子配上后,才算消停。

总结来说,Maven 的思路是好的,但在国内并不适用,因为我们不是随处都有 WIFI 可用,即使有网速度也很调皮,即使速度还可以,没有梯子也是狒狒一个!

解决办法,一是在有好网的环境下,用 Maven 把包自动下下来就够了,剩下去除 Maven。

二是搭建本机的 Maven 镜像服务器,这个不仅可以用于 JavaWeb ,而且 Android Studio 的 Gradle 也可以用,有时间偿试一下,后文再补。

说到 Maven 不得不插一句苹果的 CocoaPods,这类东西,在国内 WIFI 没有随处可用的情况下,还是尽量别碰为好,可能苹果的会好些吧!

想来,也许本地 Maven 或 CocoaPods 镜像服务器应该作为各自开发环境的标准才好,在有网的环境下一次性下载到本地或更新,其它任何时侯都不用关心这些问题了。

第二个和第三个是 JSON 输出,没有使用 Spring MVC 自带的方式,配置上就会死循环,不知哪里问题,而 4.2 的方式看官方文档有些麻烦,注解用多了,整个应用都细碎了。

这里使用 fastjson 直接把列表或对象转换成 String 再输出,其实如果想简化的话,也可以自已构建一层父类,来对返回的对象或列表进行处理。

@Controller
@RequestMapping("/test")
public class TestController implements HandlerExceptionResolver {

	@RequestMapping("/welcome")
	public ModelAndView helloWorld() {

		String message = "<br><div style=‘text-align:center;‘>"
				+ "<h3>********** Hello World, Spring MVC Tutorial</h3>This message is coming from CrunchifyHelloWorld.java **********</div><br><br>";
		return new ModelAndView("welcome", "message", message);
	}

	@RequestMapping("/say")
	@ResponseBody
    public String say() {  

		List<User> userList = new ArrayList<>();
		User user01 = new User("aaa", "123");
		User user02 = new User("bbb", "567");
		User user03 = new User("ccc", "789");
		userList.add(user01);
		userList.add(user02);
		userList.add(user03);

		String result = JSON.toJSONString(userList, true);

        return result;
    }  

	@RequestMapping(path = "/user", method = RequestMethod.GET)
	@ResponseBody
    public String getUser() {

		User user01 = new User("aaa", "123");
		String result = JSON.toJSONString(user01, true);
        return result;
    }

    @RequestMapping(value = "/upload", method = RequestMethod.GET)
    public String crunchifyDisplayForm() {
        return "uploadfile";
    }

    @RequestMapping(value = "/savefiles", method = RequestMethod.POST)
    public String crunchifySave(
            @ModelAttribute("uploadForm") FileUploadModel uploadForm,
            Model map) throws IllegalStateException, IOException {

        String saveDirectory = "D:/TestResult/crunchify/";
        //String saveDirectory = "/root/workspace/upload/";

        List<MultipartFile> crunchifyFiles = uploadForm.getFiles();
        List<String> fileNames = new ArrayList<String>();

        if (null != crunchifyFiles && crunchifyFiles.size() > 0) {
            for (MultipartFile multipartFile : crunchifyFiles) {

                String fileName = multipartFile.getOriginalFilename();
                if (!"".equalsIgnoreCase(fileName)) {
                    // Handle file content - multipartFile.getInputStream()
                    multipartFile.transferTo(new File(saveDirectory + fileName));
                    fileNames.add(fileName);
                }
            }
        }

        map.addAttribute("files", fileNames);
        return "uploadfilesuccess";
    }

	@Override
	public ModelAndView resolveException(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception exception) {
		Map<String, Object> model = new HashMap<String, Object>();
        if (exception instanceof MaxUploadSizeExceededException)
        {
            model.put("errors", exception.getMessage());
        } else
        {
            model.put("errors", "Unexpected error: " + exception.getMessage());
        }
        model.put("uploadedFile", new FileUploadModel());
        return new ModelAndView("/uploadfile", model);
	}
}
时间: 2024-10-21 14:24:53

Spring MVC 多文件上传大小限制及异常处理的相关文章

【Spring学习笔记-MVC-13】Spring MVC之文件上传

作者:ssslinppp       1. 摘要 Spring MVC为文件上传提供了最直接的支持,这种支持是通过即插即用的MultipartResolve实现的.Spring使用Jakarta Commons FileUpload技术实现了一个MultipartResolver实现类:CommonsMultipartResolver. 下面将具体讲解Spring MVC实现文件上传的具体步骤. 2. 添加Jar包 Spring MVC文件上传,需要添加如下两个jar包: commons-fil

spring mvc ajaxfileupload文件上传返回json下载问题

问题:使用spring mvc ajaxfileupload 文件上传在ie8下会提示json下载问题 解决方案如下: 服务器代码: @RequestMapping(value = "/addAnalysis", method = RequestMethod.POST) public void addAnalysisUI( HttpServletResponse response,HttpServletRequest request,HttpSession session, @Requ

Ext4.2结合Spring MVC实现文件上传显示进度

1.实现原理: 在大文件上传时显示上传进度是很有必要的,不能让用户感觉到陷入无穷的等待中,或感觉程序已经卡死.为此我们可以在session中存一个上传进度的变量,在文件上传的过程中实时的去修改这个值,这就需要在后台重写Spring MVC自带的上传解析类,每上传一定的字节数就修改一下session中的进度,在前台通个AJAX请求每隔一定的时间去获取这个值显示给用户,这样就达到了显示上传进度的需求,不过这样频繁的请求服务器无疑是增加了服务器的压力,在没有使用任何第三方上传组件的情况下只能如此. 2

Spring MVC实现文件上传和下载

本篇博客将讲解的是Springmvc的文件上传和下载功能.对于上传功能,我们在项目中是经常会用到的,比如用户注册的时候,上传用户头像,这个时候就会使用到上传的功能.而对于下载,使用场景也很常见,比如我们项目中有个使用说明是是pdf版的,会提供给用户进行下载的功能.相对于来说,这两个功能都是很常见,废话不多说,按照惯例,我们先来看一下本篇博客的目录. 目录 一:搭建SpringMvc开发环境 二:实现文件上传的功能 三:将上传文件绑定到具体的对象上 四 : 实现用户下载的功能 五:总结 一:搭建S

spring mvc注解文件上传下载

需要两个包: 包如何导入就不介绍了,前端代码如下(一定要加enctype="multipart/form-data"让服务器知道是文件上传): <form action="upload.do" method="post" enctype="multipart/form-data"> <input type="file" id="upimage" name="f

java之spring mvc之文件上传

目录结构如下: 注意,下面说的配置文件,一般都是值的src下的配置文件,即mvc.xml.如果是web.xml,则直接说 web.xml 1. 文件上传的注意点 表单必须是post提交,必须将 enctype 设置为 “multipart/form-data”, 使用 commons-fileupload 提交文件,需要添加 commons-fileupload 和 commons-io 的 jar 包. 2.Jsp 页面 <form action="file/upload.do"

Spring MVC 之文件上传(七)

SpringMVC同样使用了apache的文件上传组件.所以需要引入以下包: apache-commons-fileupload.jar apache-commons-io.jar 在springAnnotation-servlet.xml中配置 1 <!-- 定义文件上传解析器 --> 2 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.Common

spring mvc CommonsMultipartResolver文件上传maxUploadSize限制大小

第一步:配置sping Xml代码   <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!--1024*200即200k--> <property name="maxUploadSize" value="204800"/> <

Spring MVC环境中文件上传大小和文件类型限制以及超大文件上传bug问题

    在上一篇文章中,主要介绍了Spirng MVC环境下的正常情况下文件上传功能实现.在实际开发的时候,还会涉及到上传文件大小和类型的限制,接下来就会对Spirng MVC环境下文件上传大小和类型的限制进行介绍,还会讲解到文件上传大小tomcat服务器bug问题及解决方案. 一.文件上传大小限制 这里还是接着上篇文章先介绍Spring MVC下的文件上传大小限制,文件上传大小的限制在springmvc-config.xml中配置文件解析器CommonsMultipartResolver时即可