SpringMvc文件上传

文件上传

说明

在Java中,主流的文件上传方式有两种,分别是通用文件上传(commons-fileupload)和Servlet3.0方式的文件上传。SpringMVC分别对着两种方式都做了支持。

  • CommonsMultipartResolver
  • StandardServletMultipartResolver

除此之外SpringMVC对文件上传的接口做了统一的封装,使用MultipartFile接口代替了通用上传中的FileItem和Servlet3.0中的Part,使得开发人员在业务代码中可以使用统一的接口处理,而不用管底层用的是哪种文件上传实现方式。

基于Apache Fileupload通用文件上传包

  1. 添加依赖

    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.4</version>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.6</version>
    </dependency>
    
  1. 在SpringMVC配置文件中添加MultipartResolver文件上传解析器

    <!-- 配置基于apache fileupload的通用文件上传器(注意:id属性不可省略) -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 指定文件上传编码 -->
        <property name="defaultEncoding" value="UTF-8" />
    </bean>
    
  1. 在Controller中编写文件上传逻辑代码

"myFile" 对应jsp页面上传文件的组件name
<input type="file" name = "myFile"/>

@RequestMapping("/upload")
public String upload(@RequestParam("myFile") MultipartFile file, HttpServletRequest req, Model model) {
    try {
        // 使用SpringMVC给我们提供的工具类获取项目中upload文件夹在硬盘上的绝对路径
        String uploadPath = WebUtils.getRealPath(req.getServletContext(), "/upload/");
        // 将上传的文件写到上传目录
        file.transferTo(new File(uploadPath+file.getOriginalFilename()));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

基于Servlet3.0标准API文件上传

  1. 开启Servlet文件上传支持

    web.xml

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 开启Servlet文件上传支持 -->
        <multipart-config />
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    
  1. 在SpringMVC中配置MultipartResolver

    <!-- 配置基于Servlet3.0文件上传器(注意:id属性不可省略) -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver" />
    
  1. 在Controller中编写文件上传逻辑代码

    实现方式同通用上传代码一样。

文件名上传乱码问题

  • 使用通用上传方式的解决方法

    在配置的CommonsMultipartResolver bean中注入属性

    <!-- 配置基于apache fileupload的通用文件上传器(注意:id属性不可省略) -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 指定文件上传编码 -->
        <property name="defaultEncoding" value="UTF-8" />
    </bean>
    
  • 使用Servlet3.0标准上传方式的解决方法

    通过配置SpringMVC提供的编码过滤器解决

    web.xml

    <filter>
        <filter-name>characterFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    本质上还是设置请求的编码 request.setCharacterEncoding("UTF-8");

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容