SpringMVC文件上传对Servlet3的支持

简介: SpringMVC内置了对文件上传的支持,它需要我们配置一个MultipartResolver,Servlet3之前它只有一个基于commons-fileupload的实现CommonsMultipartResolver,笔者以前也写过一篇基于CommonsMultipartResolver的文件上传的博文,地址是http://elim.iteye.com/blog/1188116。

SpringMVC内置了对文件上传的支持,它需要我们配置一个MultipartResolver,Servlet3之前它只有一个基于commons-fileupload的实现CommonsMultipartResolver,笔者以前也写过一篇基于CommonsMultipartResolver的文件上传的博文,地址是http://elim.iteye.com/blog/1188116。Servlet3之后SpringMVC提供了另一个基于Servlet3的文件上传的实现,叫StandardServletMultipartResolver。本文将只介绍基于Servlet3的文件上传支持,作为以前写的基于commons-fileupload的实现的博文的一个补充。

首先需要定义一个StandardServletMultipartResolver类型的bean,对应的id默认情况下必须为multipartResolver,具体可以查看DispatcherServlet.initMultipartResolver()。

<!-- 上传文件的解析器 -->
<bean id="multipartResolver"
    class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
</bean>

然后需要启用Servlet3的文件上传支持,需要我们在web.xml中定义DispatcherServlet时定义<multipart-config/>,如果是基于注解配置的,则需要使用@javax.servlet.annotation.MultipartConfig

<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <!-- 启用Servlet3文件上传支持 -->
    <multipart-config>
        <file-size-threshold>512000</file-size-threshold>
        <location></location>
        <max-file-size></max-file-size>
        <max-request-size></max-request-size>
    </multipart-config>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

启用了基于Servlet3的文件上传支持时,我们在Controller中有四种方式来接收上传的文件。

  • 通过Spring的org.springframework.web.multipart.MultipartFile直接接收。
  • 通过Servlet3提供的javax.servlet.http.Part接收。
  • 通过Spring的org.springframework.web.multipart.MultipartHttpServletRequest的getFile()获取。
  • 通过Servlet3的javax.servlet.http.HttpServletRequest的getPart()获取。
@RequestMapping(value="doupload", method=RequestMethod.POST)
@ResponseBody
public Object doUpload(@RequestParam("file1") MultipartFile file1, 
@RequestParam("file2") Part file2,
        MultipartHttpServletRequest multiRequest, HttpServletRequest request) 
throws Exception {
    //保存文件
    Map<String, Object> result = new HashMap<>();
    result.put("file1.contentType", file1.getContentType());
    result.put("file1.size", file1.getSize());
    result.put("file2.contentType", file2.getContentType());
    result.put("file2.size", file2.getSize());
    //其它信息可以参考各自的API
    
    
    //也可以通过MultipartHttpServletRequest的API获取文件
    file1 = multiRequest.getFile("file1");//获取file1
    file1 = multiRequest.getFile("file2");//获取file2
    MultiValueMap<String, MultipartFile> multiFileMap
         = multiRequest.getMultiFileMap();//所有的文件
    
    
    //如果是基于Servlet3的文件上传,也可以通过HttpServletRequest获取文件
    file2 = request.getPart("file1");
    file2 = request.getPart("file2");
    Collection<Part> parts = request.getParts();//获取所有的文件
    if (multiFileMap != null && parts != null) {
        
    }
    return result;
}

(本文是基于Spring4.1.0所写)

目录
相关文章
|
7月前
|
设计模式 前端开发 Java
了解 Spring MVC 架构、Dispatcher Servlet 和 JSP 文件的关键作用
Spring MVC 是 Spring 框架的一部分,是一个 Web 应用程序框架。它旨在使用 Model-View-Controller(MVC) 设计模式轻松构建Web应用程序。
115 0
|
7月前
spring3 springfox报错Type javax.servlet.http.HttpServletRequest not present
spring3 springfox报错Type javax.servlet.http.HttpServletRequest not present
816 0
|
7月前
|
Java 开发者
Servlet 教程 之 Servlet 文件上传 1
Servlet 文件上传教程展示了如何利用 HTML 表单和 Servlet 处理文件上传。关键点包括:POST 方法的 form,enctype 设为 &quot;multipart/form-data&quot;,以及 action 指向如 UploadServlet 的处理程序。所需的 jar 包有 commons-fileupload-1.3.2 和 commons-io-2.5.jar。Servlet 3.0 已内置文件上传支持,无需额外组件。示例的 upload.jsp 文件包含一个单文件上传表单,使用 input[type=&quot;file&quot;] 元素。
85 5
|
7月前
|
XML 数据格式
Servlet 教程 之 Servlet 文件上传 3
该教程介绍了如何使用Servlet进行文件上传。在web.xml中配置了Servlet `UploadServlet`,类为`com.baidu.test.UploadServlet`,映射路径为`/TomcatTest/UploadServlet`。用户需通过创建的HTML表单提交文件,访问URL为:http://localhost:8080/TomcatTest/upload.jsp。
38 0
|
5月前
|
前端开发 Java 应用服务中间件
Spring Boot 2.x 嵌入式 Servlet 容器
Spring Boot使用内嵌Tomcat,默认端口8080,可通过`application.properties`配置端口、上下文路径等。配置方式有两种:1) 直接在配置文件中添加`server.port`和`server.servlet.context-path`;2) 创建`WebServerFactoryCustomizer` Bean来自定义配置,如设置端口`factory.setPort(8083)`,这种方式优先级更高。
|
6月前
|
Java Apache
基于servlet完成文件上传功能
基于servlet完成文件上传功能
47 0
|
7月前
|
缓存 前端开发 Java
15:Servlet 3.0文件上传与下载-Java Web
15:Servlet 3.0文件上传与下载-Java Web
196 5
|
Java
java servlet 文件上传 req.getPart null 返回空值
java servlet 文件上传 req.getPart null 返回空值
148 0
|
7月前
|
存储 Java Apache
Servlet 教程 之 Servlet 文件上传 2
该教程介绍了如何使用Servlet进行文件上传。关键步骤包括:确保引入Apache Commons FileUpload和IO库,创建`UploadServlet`,设置上传配置,解析请求以提取文件数据,并将文件保存至服务器指定目录。如果上传成功,用户将被重定向到`message.jsp`显示提示信息。
78 1
|
7月前
spring3 springfox报错Type javax.servlet.http.HttpServletRequest not present
spring3 springfox报错Type javax.servlet.http.HttpServletRequest not present
258 0