SpringMVC提供了一个MultipartResolver接口用来实现文件上传,并使用Commons FileUpload技术实现了一个该接口的实现类CommonsMultipartResolver。如果要在SpringMVC中实现文件上传功能,就可以在springmvc.xml中配置MultipartResolver接口的实现类。

以下是使用SpringMVC实现文件上传的具体步骤:

①导入JAR包:

使用SpringMVC实现文件上传,需要额外导入以下2个JAR包:

commons-fileupload-1.2.1.jar commons-io-2.0.jar

②在SpringMVC配置文件中,配置MultipartResolver接口的实现类

springmvc.xml

复制
  1. <bean id="multipartResolver"
  2. class="org.springframework.web.multipart.
  3. commons.CommonsMultipartResolver">
  4. <property name="defaultEncoding" value="UTF-8"></property>
  5. <property name="maxUploadSize" value="1024000"></property>
  6. </bean>

需要注意,这个bean的id值必须是multipartResolver。DispatcherServlet在Web服务启动时,会自动查找id=”multipartResolver”的Bean,并对其进行解析。如果id值不是multipartResolver, DispatcherServlet就会忽略对此Bean的解析,也就无法加入SpringMVC对文件上传的支持。

CommonsMultipartResolver中属性的介绍如下:

属性 简介
defaultEncoding 指定解析request请求的编码格式。
uploadTempDir 指定上传文件时的临时目录,默认是Servlet容器的临时目录。文件上传完毕时,临时目录中的临时文件会被自动清除。
maxUploadSize 设置上传文件的最大值,单位是字节。默认是-1,表示无限制。
maxInMemorySize 设置在文件上传时,允许写到内存中的最大值,单位是字节,默认是10240字节。

③编写请求处理方法,实现文件上传

请求处理类:SecondSpringDemo.java

复制
  1. @Controller
  2. @RequestMapping(value = "/SecondSpringDemo")
  3. public class SecondSpringDemo
  4. {
  5. @RequestMapping("/testFileUpload")
  6. public String testFileUpload(@RequestParam("desc") String desc, @RequestParam("file") MultipartFile file)
  7. throws IOException
  8. {
  9. String fileName = file.getOriginalFilename();
  10. System.out.println("desc: " + desc);
  11. System.out.println("OriginalFilename: " + fileName);
  12. System.out.println("InputStream: "
  13. + file.getInputStream());
  14. InputStream input = file.getInputStream();
  15. System.out.println("D:"+File.separator+fileName);
  16. OutputStream out
  17. = new FileOutputStream("D:"+File.separator+fileName);
  18. byte[] b = new byte[1024];
  19. while ((input.read(b)) != -1)
  20. {
  21. out.write(b);
  22. }
  23. input.close();
  24. out.close();
  25. return "success";
  26. }
  27. }

通过参数@RequestParam("file") MultipartFile file获取到前端传来的File对象,并通过file.getInputStream()得到File对象的输入流,之后再通过输出流将文件写入到D盘,即实现文件上传功能。

④测试

index.jsp

复制
  1. <form action="SecondSpringDemo/testFileUpload"
  2. method="POST" enctype="multipart/form-data">
  3. 文件: <input type="file" name="file"/>
  4. 描述: <input type="text" name="desc"/>
  5. <input type="submit" value="Submit"/>
  6. </form>

在JSP页面中使用文件上传时,除了文件的字段要使用type="file"外,还需要注意设置表单的提交方式以及编码类型,即method="POST" enctype="multipart/form-data"

32.2 拦截器

32.2.1 拦截器简介

拦截器的实现原理和过滤器相似,都可以对用户发出的请求或者对服务器做出的响应进行拦截。SpringMVC也提供了一个用于支持拦截器的HandlerInterceptor接口,此接口的实现类就是一个拦截器。

HandlerInterceptor接口包含了以下方法:

方法 简介
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception 用于拦截客户端发出的请求。此方法会在request请求到达服务器之前被调用,如果拦截处理后,需要将请求放行,则返回true;如果拦截处理后,需要结束请求(即让请求不再向服务器传递),则返回false。
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception 用于拦截服务器发出的响应。此方法会在请求处理方法执行处理完request请求之后、服务器发出的response响应到达DispatcherServlet的渲染方法之前被调用,参见下图。
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception 此方法会在DispatcherServlet将response响应的视图渲染完毕之后被调用,参见下图。

拦截器的执行流程如下:

图32-01

32.2.2 拦截器使用步骤

以下是在SpringMVC中创建并使用拦截器的具体步骤:

①创建自定义拦截器

创建一个类,并实现HandlerInterceptor接口,如下:

FirstInterceptor.java

复制
  1. //import…
  2. public class FirstInterceptor implements HandlerInterceptor
  3. {
  4. // 拦截客户端发出的请求
  5. @Override
  6. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
  7. {
  8. System.out.println("第一个拦截器的preHandle()方法...");
  9. return true;// 将请求放行
  10. }
  11. // 用于拦截服务器发出的响应
  12. @Override
  13. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
  14. ModelAndView modelAndView) throws Exception
  15. {
  16. System.out.println("第一个拦截器的postHandle()方法...");
  17. }
  18. // 视图渲染完毕之后被调用
  19. @Override
  20. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
  21. throws Exception
  22. {
  23. System.out.println("第一个拦截器的afterCompletion()方法...");
  24. }
  25. }

②配置拦截器

将写好的拦截器配置到SpringMVC配置文件之中:

springmvc.xml

复制
  1. <mvc:interceptors>
  2. <!-- 配置自定义的拦截器 -->
  3. <bean class="org.lanqiao.interceptor.FirstInterceptor">
  4. </bean>
  5. </mvc:interceptors>

③测试

默认的拦截器会拦截所有向服务器发送的请求,如下:

请求处理类:SecondSpringDemo.java

复制
  1. @Controller
  2. @RequestMapping(value = "/SecondSpringDemo")
  3. public class SecondSpringDemo
  4. {
  5. @RequestMapping("/testInterceptor")
  6. public String testInterceptor()
  7. {
  8. System.out.println("请求处理方法...");
  9. return "success";
  10. }
  11. }

index.jsp

<a href="SecondSpringDemo/testInterceptor">testInterceptor</a>

执行index.jsp中的超链接,控制台的运行结果:

图32-02

32.2.3 拦截器的拦截配置

以上方法实现的拦截器会拦截所有请求,此外我们还可以通过配置,使得拦截器只拦截或不拦截某些特定请求。为此,只需要将SpringMVC中对拦截器的配置修改如下:

springmvc.xml

复制
  1. <mvc:interceptors>
  2. <mvc:interceptor>
  3. <!-- 拦截的请求路径 -->
  4. <mvc:mapping path="/**"/>
  5. <!-- 不拦截的请求路径 -->
  6. <mvc:exclude-mapping
  7. path="/SecondSpringDemo/testFileUpload"/>
  8. <bean lass=" org.lanqiao.interceptor.FirstInterceptor ">
  9. </bean>
  10. </mvc:interceptor>
  11. </mvc:interceptors>

<mvc:interceptor>子元素的简介如下:

元素 简介
<mvc:mapping path=""/> 配置会被拦截器拦截的请求路径。
<mvc:exclude-mapping path=""/> 配置不会被拦截器拦截的请求路径。

最终拦截的请求路径是mappingexclude-mapping的交集。例如,上述springmvc.xml中配置的FirstInterceptor拦截器:会拦截除了请求路径是/SecondSpringDemo/testFileUpload以外的所有请求。

本例中只涉及到了一个拦截器,如果配置了多个拦截器,则多个拦截器拦截请求/响应的顺序与使用多个过滤器拦截请求/响应的顺序是完全相同的,读者可以参见“过滤器与监听器”一节。

转载于:https://www.cnblogs.com/gu-bin/p/10546837.html

SpringMVC 上传文件and过滤器相关推荐

  1. SpringMVC上传文件

    首先自我介绍一下,我是王登高,下面是我的头像: 是不是很帅,我每天照镜子都感觉自己帅. 好了不扯这些没用的,我们进入正题:前两天,自己边学边做遇到的SpringMVC上传文件的问题,用户可以上传图片, ...

  2. SpringMVC上传文件出现400 Bad Request错误

    1.起因 写了上传文件代码,用postman测试一下报400 Dad Request. 2.原因 看了下资料了解到使用SpringMVC上传文件需要在form表单中添加enctype="mu ...

  3. SpringMVC上传文件配置

    方式一:将multipartResolver中的属性分别单独配置(推荐) <!-- SpringMVC文件上传 --><bean id="multipartResolver ...

  4. form表单上传文件_SpringBoot中如何使用SpringMVC上传文件?

    今天我们要说的这个话题很简单,不要问为啥,因为SpringBoot,哈哈.现在SpringBoot可以说人人都会用了,它的好处是显而易见的,大大的简化了配置,一起来看看吧. 我们分以下3种情况来谈这个 ...

  5. SpringMVC上传文件的三种方式

    /** 通过流的方式上传文件* @RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象*/@Reques ...

  6. SpringMVC上传文件解析request请求为空获取不到数据问题

    2019独角兽企业重金招聘Python工程师标准>>> 一.原因分析 首先我们来看下Spring mvc 中文件上传的配置 <bean id="multipartRe ...

  7. SpringMVC上传文件以流方式判断类型附常用类型

    1 // 此类中判断类型所截取的byte 长度暂不确定,请使用者测试过使用 2 package com.tg.common.other; 3 4 import com.tg.common.tginte ...

  8. SpringMVC 上传文件或图片并以二进制流的方式存到数据库

    最近些项目遇到一个上传图片和文件并且以二进制流的方式存到数据库,下面介绍一个小案例: 所需jar包: commons-fileupload-1.2.1.jar jsp页面: 后端代码: 值得注意的是: ...

  9. 记录一个解决了一个下午加一个晚上的问题,关于springMVC上传文件的功能

    ObjectMapper objectMapper=new ObjectMapper(); springmvc在使用jackson的时候,tomcat没有自动导入jar下的文件. 需要手动导入一下: ...

最新文章

  1. 5G NGC — NSSF 网络切片选择功能
  2. no.7_qzhai 开心版_传世霸业超变版下载-传世霸业超变版手机版下载v1.0
  3. 多态性与虚拟函数一个典型的例子第一步
  4. 6.Maven聚合和继承,相关案例配置
  5. 分治法求数组最大值 c语言,使用分治法求最大子数组的下标。
  6. JavaScript 概述
  7. 【Elasticsearch】使用 Elasticsearch Freeze index API 创建冻结索引
  8. idea json转为对象_数据存储—JSON
  9. python教程龟叔_Python新手入门
  10. 不得罪人 VS 不怕得罪人
  11. 宇宙最全的架构开发技术百科全书
  12. (秒杀项目) 4.4 用户下单与秒杀
  13. Android去掉wps广告,WPS解锁高级功能,PC和安卓版去除广告,精简版!
  14. C++ 二维数组指针遍历
  15. 最新的ESD(ElectroStatic Discharge)静电介绍及其标准下载(见文尾)
  16. 新手不要再被误导!这是一篇最新的Xposed模块编写教程
  17. Sun Jan 29 14:34:06 格林尼治标准时间+0800 2012”解析
  18. 智能注塑工艺与模流分析技术研讨会暨上海大学Moldex3D实训基地开幕式圆满结束
  19. 猫哥教你写爬虫 019--debug-作业
  20. ad17编辑界面怎么检查未连线_EZCast投屏软件提示未发现装置,请检查网路连线状态怎么办?...

热门文章

  1. MySQL查询语句后面加上“\G”,提示 ERROR: No query specified
  2. javadoc - Java API 文档生成器(Windows版本)
  3. IntelliJ IDEA for Mac 如何配置项目模块的源代码根目录_源码文件的根目录
  4. Windows 7 下安装 Oracle 数据库和 PL/SQL Developer
  5. MacBook 如何通过命令终端进入 U 盘内的目录
  6. python测试开发实战_《python测试开发实战》基于pytest基础部分实例1-Hello
  7. java json 易用_Java中 Json的使用
  8. go语言mysql操作_使用Go语言操作MySQL数据库的思路与步骤
  9. python 删除csv第一行_python 标准库学习之 csv
  10. php内置的数组函数大全,php数组的内置函数大全