SpringMVC实现文件的上传(CommonsMultipartResolver和StanderServletMultipartResolver)

     一定要足够优秀才能堵住悠悠众口。

b14fbd0383c74866b141a8322afde37c.jpg

 

文件上传功能在SpringMVC中有两种方法(两种不同的处理器)

2df7c8607da74692b9cbedeb95edd23c.png

 这篇文章我们将通过这两种方法来实现文件上传功能

1:CommonsMultipartResolver

创建一个新的Maven项目并在项目中进行基础的环境配置

Maven项目基础配置,如果不同可以参考一下

一:在pom.xml中导入我们即将用到的依赖

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

二:创建网页,实现前端出现页面

注意:这里创建的是动态网页

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form  action="/play" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" value="提交">
</form>
</body>
</html>

三:创建SpringMVC框架的控制器

package fileupload_demo1;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@Controller
public class CT1 {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("/yyyy/MM/dd/"); //创建日期,并标注时间显示格式
    @GetMapping("/upload")
    public String play1(){
        return "hh";
    }
    @RequestMapping("/play")
    @ResponseBody
    public String play1(MultipartFile file, HttpServletRequest req) throws IOException {
        String format = simpleDateFormat.format(new Date());  //获取今天的日期
        String realpath = req.getServletContext().getRealPath("/img") +format; //获取Tomcat中的临时储存文件
        File folder = new File(realpath);
        if(!folder.exists()){   //检查目录是否存在
            folder.mkdirs();    //目录不存在进行创建
        }
        String oldname = file.getOriginalFilename(); //得到上传时的文件名
        String name = UUID.randomUUID().toString()+oldname.substring(oldname.lastIndexOf(".")); //UUID.randomUUID().toString():Java中自动生成主键的方法,机器中生成的一串生成数字
        file.transferTo(new File(folder,name)); //将前端传来的数据保存指定名字保存在指定文件夹下
        String url = req.getScheme()+ "://"+req.getServerName() +":"+req.getServerPort() +"/img" +format +name;
        return url;

        //http://localhost:8080/img/2022/11/13/8d3910d1-2a7c-47ce-8251-3cc4eeaf0bc4.jpeg

    }

}

注意:下面标注了代码获取的结果

c7e57f38f15648e2903bf070bce07685.png

 四:配置SpringMVC

<?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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--    创建组件扫描功能-->
    <context:component-scan base-package="fileupload_demo1"></context:component-scan>
    <mvc:annotation-driven/>
<!--默认情况下,静态资源是被拦截的,需要修改这种射中-->
    <mvc:resources mapping="/**" location="/"></mvc:resources>
<!--配置文件上传所需要的类,并进行参数配置-->
    <bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver">
     <!--默认的编码-->
    <property name="defaultEncoding" value="UTF-8"/>
    <!--上传的总文件大小-->
    <property name="maxUploadSize" value="1048576"/>
    <!--上传的单个文件大小-->
    <property name="maxUploadSizePerFile" value="1048576"/>
    <!--内存中最大的数据量,超过这个数据量,数据就要开始往硬盘中写了-->
    <property name="maxInMemorySize" value="4096"/>
    <!--临时目录,超过 maxInMemorySize 配置的大小后,数据开始往临时目录写,等全部上传完成后,再将数据合并到正式的文件上传目录-->
    <property name="uploadTempDir" value="file:///E:\\tmp"/>   
</bean>

    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="modelAndView">
        <property name="prefix" value="/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

</beans>

执行项目:

前端网页:

0893f00d25ef4ecb88d7e0833eb3addf.png

 点击提交,返回图片url

1df96c4c39744615917a806dc7b1bc70.png

 最终结果:

ba53f451a60543008c13a6551ab9517b.png

 2:StanderServletMultipartResolver(经常被使用)

这种方法的配置基本上与第一种方法相同,没有很大的区别

区别一:将SpringMVC的配置文件中文件上传的类进行更换

<?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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--    创建组件扫描功能-->
    <context:component-scan base-package="fileupload_demo1"></context:component-scan>
    <mvc:annotation-driven/>
    <mvc:resources mapping="/**" location="/"></mvc:resources>
    <bean class="org.springframework.web.multipart.support.StandardServletMultipartResolver" id="multipartResolver"></bean>
    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="modelAndView">
        <property name="prefix" value="/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

</beans>

区别二:将上传文件的参数配置放在web.xml中

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--    配置spring框架的基础内容-->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring.xml</param-value>
        </context-param>
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>

    <!--    springmvc的配置内容-->
    <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>
    <!--第二种文件上传方法中的参数配置-->
        <multipart-config>
            <!--文件保存的临时目录,这个目录系统不会主动创建-->
<!--            <location>D:\\temp</location>-->
            <!--上传的单个文件大小-->
            <max-file-size>1048576</max-file-size>
            <!--上传的总文件大小-->
            <max-request-size>1048576</max-request-size>
            <!--这个就是内存中保存的文件最大大小-->
            <file-size-threshold>4096</file-size-threshold>
        </multipart-config>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <filter>
        <filter-name>encoding</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>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

其他的内容不变实现的功能是相同的结果

 

 

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: CommonsMultipartResolver 是一个用于解析多部分请求的类,它是 Apache Commons FileUpload 库的一部分。它可以解析上传文件并将其存储在服务器上。在 Spring MVC 中,可以使用 CommonsMultipartResolver 来处理文件上传请求。 ### 回答2: CommonsMultipartResolver (以下简称CMR)是一个用于处理多部分请求(multipart request)的 Spring 框架类,用于上传文件或数据的处理。 当我们使用 HTML 表单上传文件时,表单的 enctype 属性必须设置为 "multipart/form-data"。这时,对于上传文件,服务器需要分离出文件和其他表单项,并将它们分别处理。CMR 类正是用来完成这个工作的。 CMR 类需要集成 Apache Commons FileUpload 库,该库提供了对上传文件的全面支持。CMR 类是 Spring 对 FileUpload 库的包装器,它使用受支持的解析器对 multipart 文件进行处理,并将解析的内容存储在 Spring 提供的 MultipartHttpServletRequest 中,以便更容易地进行处理。 对于上传文件,我们通常需要保存在服务器上或存储在数据库中。CMR 也能够实现这些功能。通过 CMR 的 setUploadTempDir() 方法,可以设置存储上传文件的临时目录。当 CMR 完成对文件的处理后,我们可以直接访问上传文件,然后将其保存到我们需要的位置,或者将其存储到数据库中。 在 Spring 3.1 之前,CMR 是默认的 MultipartResolver 实现,但在 Spring 3.1 的更改后,它已经换成了 StandardServletMultipartResolver。但是,如果你选择使用 CMR,你可以轻松地使用它来上传任意大小的文件,同时又不会占用过多的内存。这也是 Spring 对 CMR 停止默认支持的一个原因,因为它需要依赖第三方库,会让项目变得更加臃肿。 总而言之,CommonsMultipartResolver 是一个用于处理多部分请求的强大工具,它能够快速而准确地将上传文件和其他表单项进行分离,并将它们存储在请求对象中,以便于我们进行处理和管理。通过它,我们可以方便地上传任意大小的文件,并将它们存储到我们需要的位置,这些都是非常实用的功能。 ### 回答3: CommonsMultipartResolver是一个Spring框架的类,用于处理multipart/form-data类型的请求。multipart/form-data类型的请求常用于文件上传、图片上传等场景。 在Spring框架中,我们可以使用文件上传的注解@RequestParam或@RequestPart来处理multipart/form-data类型的请求,但这两种方式只适用于单个文件上传。如果需要上传多个文件,则需要使用CommonsMultipartResolverCommonsMultipartResolver主要的作用是解析multipart/form-data类型的请求,并将请求中的文件保存到指定的位置。在Spring框架中,我们可以通过将CommonsMultipartResolver实例化并将其注册到Spring的DispatcherServlet中来完成文件上传的工作。 CommonsMultipartResolver可以通过配置一些参数来控制文件上传的行为,比如文件大小的限制、文件上传的临时目录、上传文件的字符编码等等。通过设置这些参数,我们可以更好地控制文件上传的过程,并保证文件上传的安全性。 在使用CommonsMultipartResolver时,我们需要注意一些细节,比如文件上传失败的异常处理、设置上传文件的真实名称、上传文件的自定义校验等等。这些细节的处理需要我们在编写代码时多加注意,保证文件上传功能的稳定和可靠。 总之,CommonsMultipartResolver是一个非常常用的Spring框架类,可以帮助我们实现文件上传的功能。在使用CommonsMultipartResolver时,我们需要注意一些细节,并根据需要配置相应的参数以实现更好的文件上传体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不想睡醒的梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值