首页 > 代码库 > SpringMVC之文件上传

SpringMVC之文件上传

  上传是web程序中常见的功能,当使用上传时,需要把form表单中的enctype属性改为multipart/form-data,这样就使用了二进制进行上传,而后台需要解析这些数据。DispatcherServlet并不能解析它,而需要委托给Spring中的MultipartResolver接口实现去解析。在Spring3.1之后,Spring内置了两种MultipartResolver的实现:

  • CommonsMultipartResolver:使用了Jakarta Commons FileUpload来解析
  • StandardServletMultipartResolver:基于Serlvet3.0对multipart的支持

  本随笔将对二者就行举例:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="${pageContext.request.contextPath }/user/upload" method="post" enctype="multipart/form-data">
        <input name="txt" type="text" placeholder="文本信息"><br>
        <input name="file" type="file"><br>
        <input type="submit">
    </form>
</body>
</html>

Controller代码:

package cn.powerfully.demo.web.controller;

import java.io.IOException;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;

@Controller
@RequestMapping("user")
public class UserController {
    
    @RequestMapping(path = "upload", method = RequestMethod.GET)
    public String uploadUI(Model model) {
        return "upload";
    }

    @RequestMapping(path = "upload", method = RequestMethod.POST)
    public String upload(Model model, String txt, MultipartFile file) throws IllegalStateException, IOException {
        if (file == null) {
            model.addAttribute("msg", "上传失败!");
        } else {
            String msg = String.format("文本信息:%s<br>文件名:%s<br>文件大小:%d字节<br>", txt, file.getOriginalFilename(),
                    file.getSize());
       //... model.addAttribute(
"msg", msg); } return "msg"; } }

一、StandardServletMultipartResolver

  首先需要创建StandardServletMultipartResolver对象,可以在springMVC配置文件中添加如下代码,注意一定要加上id(按id装配)

<bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver" />

  对于上传的参数,不是在bean中配置的,而是在web.xml中的DispatcherServlet配置的:

<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    <multipart-config>
        <location>/</location>
        <max-file-size>102400</max-file-size>
        <max-request-size>204800</max-request-size>
    </multipart-config>
</servlet>

  使用multipart-config节点进行配置,在multipart-config中,有四个子节点:

location 上传文件所存放的临时目录。必须指定
max-file-size 文件的最大大小,单位为字节。默认没有限制
max-request-size 请求的最大大小,单位为字节。默认没有限制
file-size-threshold 文件大小阈值,当大于这个阈值时将写入到磁盘,否则在内存中。默认值为0

二、CommonsMultipartResolver

  因为基于Jakarta Commons FileUpload,所以要先引入commons-fileupload

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
</dependency>

  接着只需要在springMVC的配置文件中装载Bean即可

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver" />

  要配置参数,只要对bean注入参数:

<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="defaultEncoding" value="utf-8" /> 
    <property name="maxUploadSize" value="1024000" />
    <property name="maxInMemorySize" value="204800" />
    <property name="uploadTempDir" value="/" />
</bean>
defaultEncoding 默认的解析编码,默认为iso-8859-1
maxUploaadSize 上传文件的最大大小,默认为-1(无限制)
maxInMemorySize 内存缓冲区大小,超过时写入硬盘,默认为-1(无限制)
uploadTempDir   临时文件目录,默认是serlvet容器的临时目录

  除了以上参数,还有其他的......

SpringMVC之文件上传