Spring MVC实现MultipartFile文件上传功能

本文详细介绍如何在前端使用HTML的文件选择标签与multipart/form-data进行文件上传,包括SpringMVC的MultipartFile类使用、MultipartResolver配置及两种实现类的对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前端

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>修改信息</title>
</head>
<body>
    <form action="/shop/updateUserinfo" enctype="multipart/form-data" method="post">
        <table>
            <tr>
                <td>请选择头像:</td>
                <td><input type="file" name="image" /></td>
            </tr>
            <tr>
                <td><input type="submit" name="submit" value="提交"/></td>
                <td><input type="reset" name="reset" value="重置"/></td>
            </tr>
        </table>
    </form>
</body>
</html>

注意:
1.文件选择标签type=“file”
2.要定义enctype=“multipart/form-data”,以二进制流传输,否则Spring MVC解析失败
3.文件提交以POST请求为主


后台

控制器实现
@RequestMapping(value = "/updateUserinfo", method = RequestMethod.POST)
@ResponseBody
public String updateUserinfo(MultipartFile file) throws IOException {
	// file是通过Spring MVC自动映射HTTP请求同名参数获取的
    if (!file.isEmpty()) {
        // 得到的是参数名 image
        log.info(file.getName());
        // 得到的是图片原来的名字如:1234.png
        log.info(file.getOriginalFilename());
        log.info(file.getSize());
        // 要保存图片到的路径和名字
        String imageUrl = "/home/lin/" +  "store.png";
        // 将上传文件保存到相应位置
        file.transferTo(new File(imageUrl());
    }
    return "";
}

MultipartFile是一个Spring MVC提供的一个类,因此还需要相应的解析器----MultipartResolver

MultipartResolver配置

MultipartResolver只是一个接口, 它有两个实现类

  1. CommonsMultipartResolver,依赖Apache下的jakarta包
  2. StandardServletMultipartResolver, 依赖Servlet3.0+, 不需要第三方包 【推荐】
使用 StandardServletMultipartResolver

在Spring MVC容器配置文件中加入以下即可

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

然后在web.xml里面配置其初始化属性(在Spring MVC的dispatcer servlet中)

  <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc/dispatcher-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
        <multipart-config>
            <!--临时文件的目录,只能是绝对路径-->
            <location>/home/lin/</location>
            <!-- 上传文件最大2M -->
            <max-file-size>2097152</max-file-size>
            <!-- 上传文件整个请求不超过4M -->
            <max-request-size>4194304</max-request-size>
        </multipart-config>
    </servlet>

虽然web.xml文件会报错,提示not allow here / can not resolve,但是不影响使用。而且如果不配就无法使用。


使用 CommonsMultipartResolver
需要commons-io和commons-fileupload两个jar包
StandardServletMultipartResolver需要在web.xml文件中配置其location还是绝对路径,但是这个不需要
<bean id="multipartResolver" 
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
   <property name="defaultEncoding" value="utf-8"></property>
   <property name="maxUploadSize" value="10485760000"></property>
   <property name="maxInMemorySize" value="40960"></property>
   <property name="resolveLazily" value="true"/>
</bean>

可以通过以下获取项目容器路径

@Autowired
private HttpServletRequest request;
...
String contextPath = request.getSession().getServletContext().getRealPath("/");

会输出项目部署在tomcat的绝对路径
如 F:\tomcat9\webapps\demo\

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值