SpringMVC学习指南【笔记7】上传文件

Spring MVC中处理已上传文件的两种方法,一是利用CommonsFileUpload元件,二是利用Servlet3本地文件上传特性。

 

客户端编程

为了上传文件,必须将html表格的enctype属性值设为multipart/form-data

<form action="action" enctype="multipart/form-data" method="post">
    select a file<input type="file" name="fieldName" /><!--这个input标签会显示成一个按钮,点击时,会打开一个对话框,用来选择文件-->
    <input type="submit" value="upload" />
</form>
<!--上传多个文件,以下3行代码都可以-->
<input type="file" name="fieldName" multiple />
<input type="file" name="fieldName" multiple="multiple" />
<input type="file" name="fieldName" multiple="" />

 

MultipartFile接口

org.springframework.web.multipart.MultipartFile

例如,Product这个实体类要添加多个文件的属性,List<MultipartFile>  files;

  @RequestMapping(value="product_save")
    public String productSave(HttpServletRequest servletRequest, @ModelAttribute Product product, BindingResult bindingResult,Model model){
        List<MultipartFile> files = product.getFiles();
        List<String> filesName = new ArrayList<String>();
        if(null != files && files.size() > 0){
            for(MultipartFile multipartFile : files){
                String fileName = multipartFile.getOriginalFilename();
                filesName.add(fileName);
                File file = new File(servletRequest.getServletContext().getRealPath("/file"), fileName);
                try {
                    multipartFile.transferTo(file);        // 保存已上传文件
                } catch (IllegalStateException | IOException e) {
                    e.printStackTrace();
                }
            }
        }
        // save product here
        model.addAttribute("product", product);
        return "productDetails";
    }

JSP页面

<form:form commandName="product" action="product_save" method="post" enctype="multipart/form-data">
    <fieldset>
        <p>
            <label for="name">product name:</label>
            <form:input id="name" path="name" cssErrorClass="error" />
            <form:errors path="name" cssErrorClass="error" />
        </p>
        <p>
            <label for="file">product file:</label>
            <input type="file" name="files[0]" />
        </p>
    </fieldset>
</form:form>

处理已上传的文件的两种方法

第一种:利用Common FileUpload元件

Spring MVC的配置文件,这里multipartResolver引用的是CommonMultipartResolver

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/springcontext.xsd
    ">

    <!-- 扫描目标包中的类 -->
    <context:component-scan base-package="com.xsl.controller" />
    <context:component-scan base-package="com.xsl.service" />
    
    <!-- 注册用于支持基于注解的控制器的请求处理方法的bean对象 -->
    <mvc:annotation-driven />
    
    <!-- 指示Spring MVC哪些静态资源需要单独处理,不需要dispatcher servlet -->
    <mvc:resources mapping="/css/**" location="/css/" />
    <mvc:resources mapping="/*.html" location="/" />
    <mvc:resources mapping="/image/**" location="/image/" />

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>
    
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="/WEB-INF/resource/messages" />
    </bean>
    
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonMultipartResolver">
    </bean>

</beans>

第二种:利用Servlet3本地文件上传特性

给部署描述符(web.xml)中的servlet声明赋值,使一个Servlet变成一个MultipartConfig Servlet,以下代码与用@MultipartConfig给DispatcherServlet进行标注的效果一样,关键是multipart-config这个元素

<?xml version="1.0" encoding="UTF-8" ?>
<web-app version="3.0"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    
    <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/config/springmvc-config.xml</param-value>
        </init-param>
        
        <load-on-startup>1</load-on-startup>
        
        <multipart-config>
            <max-file-size>20848820</max-file-size>
            <max-request-size>418018841</max-request-size>
            <file-size-threshold>1048576</file-size-threshold>
        </multipart-config>
        
    </servlet>
    
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
</web-app>

Spring MVC配置文件,这里multipartResolver引用的是StandardServletMultipartResolver

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/springcontext.xsd
    ">

    <!-- 扫描目标包中的类 -->
    <context:component-scan base-package="com.xsl.controller" />
    <context:component-scan base-package="com.xsl.service" />
    
    <!-- 注册用于支持基于注解的控制器的请求处理方法的bean对象 -->
    <mvc:annotation-driven />
    
    <!-- 指示Spring MVC哪些静态资源需要单独处理,不需要dispatcher servlet -->
    <mvc:resources mapping="/css/**" location="/css/" />
    <mvc:resources mapping="/*.html" location="/" />
    <mvc:resources mapping="/image/**" location="/image/" />

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>
    
    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="/WEB-INF/resource/messages" />
    </bean>
    
    <bean id="multipartResolver" class="org.springframework.web.support.StandardServletMultipartResolver">
    </bean>

</beans>

 

posted @ 2018-12-26 14:46  HelloWorld1815  阅读(131)  评论(0编辑  收藏  举报