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以外的所有请求。

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

SpringMVC 上传文件and过滤器的更多相关文章

  1. springmvc上传文件,抄别人的

    SpringMVC中的文件上传 分类: SpringMVC 2012-05-17 12:55 26426人阅读 评论(13) 收藏 举报 stringuserinputclassencoding 这是 ...

  2. 2. SpringMVC 上传文件操作

    1.创建java web项目:SpringMVCUploadDownFile 2.在项目的WebRoot下的WEB-INF的lib包下添加如下jar文件 com.springsource.com.mc ...

  3. 使用springMVC上传文件

    control层实现功能: @RequestMapping(value="upload2") public String upLoad2(HttpServletRequest re ...

  4. SpringMVC上传文件(图片)并保存到本地

    SpringMVC上传文件(图片)并保存到本地 小记一波~ 基本的MVC配置就不展示了,这里给出核心代码 在spring-mvc的配置文件中写入如下配置 <bean id="multi ...

  5. SpringMVC上传文件总结

    如果是maven项目 需要在pom.xml文件里面引入下面两个jar包 <dependency> <groupId>commons-fileupload</groupId ...

  6. SpringMVC 上传文件 MultipartFile 转为 File

    在使用 SpringMVC 上传文件时,接收到的文件格式为 MultipartFile,但是在很多场景下使用都需要File格式的文件,记录下以便日后使用. 以下mFile为MultipartFile文 ...

  7. springmvc 上传文件时的错误

    使用springmvc上传文件一直失败,文件参数一直为null, 原来是配置文件没写成功. <bean id="multipartResolver" class=" ...

  8. SpringMVC上传文件的三种方式(转)

    直接上代码吧,大伙一看便知 这时:commonsmultipartresolver 的源码,可以研究一下 http://www.verysource.com/code/2337329_1/common ...

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

    直接上代码吧,大伙一看便知 这时:commonsmultipartresolver 的源码,可以研究一下 http://www.verysource.com/code/2337329_1/common ...

随机推荐

  1. [SoapUI] 各种日期计算

    import java.util.*; import java.text.SimpleDateFormat; // current date String dateNew = today() // t ...

  2. Jmeter运行过程中如何让Fiddler同时可以抓获到服务器的应答报文

    在默认情况下,Jmeter运行过程中,Fiddler是抓不到对应的应答报文的. 但是,在某些时候,我们希望分析Jmeter执行失败的原因,想了解Jmeter获取到的应答报文是否有问题,就需要同服务器返 ...

  3. Proximal Algorithms

    1. Introduction Much like Newton's method is a standard tool for solving unconstrained smooth minimi ...

  4. 在delphi XE5 里面编译kbmmw4.3

    Delphi XE5 仓促的发布了,虽然开始支持Android 开发了,但是经过试用,发现那个模拟器慢到无法用, 真机可以运行,但是调试也几乎无法用.由于XE5 的主要增加的是Android 的开发支 ...

  5. 使用PrintWriter out=response.getWriter();输出script脚本时乱码解决

    使用PrintWriter out=response.getWriter();输出script脚本时乱码解决 最近遇到了一个奇怪的事情,仅仅用out.print("<script ty ...

  6. 2018.09.06 烽火传递(单调队列优化dp)

    描述 烽火台是重要的军事防御设施,一般建在交通要道或险要处.一旦有军情发生,则白天用浓烟,晚上有火光传递军情. 在某两个城市之间有 n 座烽火台,每个烽火台发出信号都有一定的代价.为了使情报准确传递, ...

  7. hdu-2191(完全背包+二进制优化模板)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191 思路:完全背包模板 #include<iostream> #include<c ...

  8. Django入门与实践-第15章:用户注销(完结)

    # myproject/settings.py LOGOUT_REDIRECT_URL = 'home' http://127.0.0.1:8000/logout/ # myproject/urls. ...

  9. Map的常用操作

    public static void main(String[] args) { Map<String, String> map = new HashMap<>(); map. ...

  10. Deployment is out of date due to changes in the underlying project contents. Deployment is out of date due to changes in the underlying project contents. You'll need to manually 'Redeploy' the projec

    原因1:导入的jar包路径不对,造成第一个错误, 原因2:设置右键工程->属性->myeclipse->web->deployment选use workbenk defaul ...