SpringMVC——文件上传拦截器

Posted Johnny*

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC——文件上传拦截器相关的知识,希望对你有一定的参考价值。

SpringMVC实现文件上传

SpringMVC可以简化文件上传的代码,但是必须实现MultipartResolver接口;该接口的实现类SpringMVC已经提供了就是CommonMutilpartResolver。那么只要将其配置到SpringMVC配置文件中并设置相应属性即可。

  1. jar包

commons-fileupload.jar 和commons-io.jar
2. 配置CommonMultipartResolver,将其加入到SpringIOC容器中

	<!-- 配置文件上传 
		注意id值不能更改,只能是multipartResolver,原因是SpringIoc容器在启动会去找id为multipartResolver的bean 这是约定
	-->
	<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="defaultEncoding" value="UTF-8"></property>
		<!-- 设置单个文件最大上传大小  单位是字节  -1表示不限制  注意不用双引号引起来-->
		<property name="maxUploadSize" value="1024000"></property>
	</bean>

Controller层保存上传的文件到服务器

	@RequestMapping("testFileUpload")
	public String  testFileUpload(@RequestParam("desc")String desc, @RequestParam("file") MultipartFile file) throws IOException {
		
		System.out.println("文件描述信息:"+desc);
		String filename = file.getOriginalFilename();
		
		InputStream in = file.getInputStream();  //获取文件IO流
		OutputStream out = new FileOutputStream("d:\\\\"+filename);
		int  len = -1;
		byte[] buff = new byte[1024];
		while( (len = in.read(buff)) != - 1) {
			out.write(buff,0,len);
		}
		out.close();
		in.close();
		System.out.println("上传成功!");
		return "success";
	}

上传页面 testuploadFile.jsp

	<form action="testFileUpload"  enctype="multipart/form-data" method="post">
		<input name="file" type="file">
		文件描述:<input name ="desc">
		<input type="submit">  
	</form>

拦截器

拦截器原理与过滤器一样。SpringMVC,要想实现拦截器,必须实现一个接口HandlerInterceptor

在这里插入图片描述

  1. 编写自己的拦截器,该拦截器实现 HandlerInterceptor接口
  2. 将自己写的拦截器配置到SpringMVC中

自定义拦截器MyInterceptor ,实现 HandlerInterceptor接口,重写preHandle、postHandle、afterCompletion方法。

package com.johnny.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class MyInterceptor implements HandlerInterceptor {
	
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		
		System.out.println("请求前");
		return true;
	}
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {
		
		System.out.println("响应前");
	}
	
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
		System.out.println("页面渲染前");
	}
}

配置拦截器

	<!-- 配置拦截器 -->
	<mvc:interceptors>
		<mvc:interceptor>
			<!-- 拦截路径  ant风格  ** 表示所有目录 -->
			<mvc:mapping path="/**" />
			<!-- 排除路径 -->
			<mvc:exclude-mapping path="/testInterceptor"/>
			<!-- 两句的意思是 表示除了 /testInterceptor 其余都拦截  -->
			<bean id="myInterceptor" class="com.johnny.interceptor.MyInterceptor"></bean>
		</mvc:interceptor>
	</mvc:interceptors>
	

可以配置多个拦截器,形成拦截链。

package com.johnny.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class MyInterceptor2 implements HandlerInterceptor {
	
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		
		System.out.println("请求前……2222");
		return true;
	}
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {
		
		System.out.println("响应前…… 2222");
	}
	
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
		System.out.println("页面渲染前…… 222");
	}
}

		<!-- 再配置一个拦截器 变成拦截链 -->
		<mvc:interceptor>
			<!-- 拦截路径  ant风格  ** 表示所有目录 -->
			<mvc:mapping path="/**" />
			<!-- 排除路径 -->
			<mvc:exclude-mapping path="/testInterceptor"/>
			<!-- 两句的意思是 表示除了 /testInterceptor 其余都拦截  -->
			<bean id="myInterceptor2" class="com.johnny.interceptor.MyInterceptor2"></bean>
		</mvc:interceptor>
	</mvc:interceptors>

拦截后请求一个被拦截的链接: /testUpload,结果 如下:
在这里插入图片描述

以上是关于SpringMVC——文件上传拦截器的主要内容,如果未能解决你的问题,请参考以下文章

JAVAEE框架技术之6-springMVC拦截器和文件上传功能

JAVAEE框架技术之6-springMVC拦截器和文件上传功能

JAVAEE框架技术之6-springMVC拦截器和文件上传功能

SpringMVC文件上传和拦截器

SpringMVC文件上传和拦截器

springMVC