Spring之配置multipartResolver解析器、上传文件、处理文件过程

 更新时间:2025年08月08日 09:47:33   作者:CrazyIdeas  
文章介绍了Spring中处理multipart表单的两种解析器(CommonsMultipartResolver和StandardServletMultipartResolver)的配置方法,包括文件大小限制、临时存储路径设置,以及通过enctype和accept属性控制上传格式,强调MultipartFile需配置解析器,而Part接口无需

multipart格式的数据 会将 一个表单拆分为 多个部分,每个部分对应一个输入域。

在一般的表单输入域中,它所对应的部分中会放置文本型数据,但是如果上传文件的话,它所对应的部分可以是二进制。

配置 multipart 解析器:

有两个:

  • CommonsMultipartResolver:使用 Jakarta Commons FileUpload 解析 multiparty。
  • StandardServletMultipartResolver:依赖于 Servlet 3.0 对 multipart 请求的支持。

配置 StandardServletMultipartResolver 解析器

1、在ApplicationContext 中声明为 bean:

@Bean
public MultipartResolver multipartResolver(){
    return new StandardServletMultipartResolver();
}

2、在 web.xml 或 Servlet 初始化类中,配置 multipart 的具体细节,如:文件大写,临时文件路径等。

  • 如果已经实现了 WebApplicationInitializer 接口,可以在Servlet registration 上调用 setMultipartConfig() 方法进行配置:
@Override
public void onStartup(ServletContext servletContext) throws ServletException {

    DispatcherServlet dispatcherServlet = new DispatcherServlet();
    ServletRegistration.Dynamic registration = servletContext.addServlet("appServlet", dispatcherServlet);
    registration.addMapping("/");
    registration.setMultipartConfig(new MultipartConfigElement("/tmp/uploads"));
}
  • 若 初始化 类 继承了AbstractAnnotationConfigDispatcherServletInitializerAbstractDispatcherServletInitializer 通过重写 customizeRegistration 方法 来配置 multipart 的具体细节
@Override
protected void customizeRegistration(ServletRegistration.Dynamic registration) {
    registration.setMultipartConfig(
            new MultipartConfigElement("/tmp/test/uploads")
    );
}

了解 MultipartConfigElement 类:

new MultipartConfigElement("/tmp/test/uploads",2097152,4194304,0)
  • 指定 临时存放目录 为/tmp/test/uploads
  • 上传文件的最大容量:2097152 = 2MB。
  • 整个 multipart 请求的最大容量 4194304 = 4MB。
  • 文件大写 达到一定容量,会写入 临时文件路径中,默认是 0,所有上传的文件都会写入磁盘中。

对应 在 web.xml 中的配置:

<servlet>
    <servlet-name>appServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
    <multipart-config>
    	<!-- 临时路劲 -->
        <location>/tmp/test/uploads</location>
        <!-- 上传文件的最大值 -->
        <max-file-size>2097152</max-file-size>
        <!--请求的最大容量-->
        <max-request-size>4194304</max-request-size>
    </multipart-config>
</servlet>

配置 CommonsMultipartResolver 解析器

声明为 bean

@Bean
public MultipartResolver multipartResolver(){
    return new CommonsMultipartResolver();
}

文件大小,临时路径等在 声明Bean 时设置。

 @Bean
public MultipartResolver multipartResolver() throws IOException {
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
    // 设置 临时目录
    multipartResolver.setUploadTempDir(new FileSystemResource("/tmp/test/uploads"));
    // 最大文件
    multipartResolver.setMaxUploadSize(2097152);
    
    multipartResolver.setMaxInMemorySize(0);
    return multipartResolver;
}

上传文件、处理文件

表单的大体样式:

<form action="" method="post" enctype="multipart/form-data">
    <input type="file" name="picture" accept="image/jpeg">
    <input type="submit" value="提交">
</form>
  • enctype="multipart/form-data" 告诉 浏览器以 multipart 数据的形式提交表单。
  • accept="image/jpeg" 限制文件接收的类型 为 JPEG。

Controller 上接收上传的文件

@RequestMapping("/upload")
public String uploadImage(@RequestPart("picture")MultipartFile file) throws IOException {
    // 获取 文件 名
    String filename = file.getOriginalFilename();
    // 将 上传的文件 写入到 文件系统中
    file.transferTo(new File("/data/image"+filename));
    return "index";
}
  • MultipartFile 接口,为处理 multipart 数据提供了内容更为丰富的对象。
public interface MultipartFile extends InputStreamSource {
    String getName();

    @Nullable
    String getOriginalFilename();

    @Nullable
    String getContentType();

    boolean isEmpty();

    long getSize();

    byte[] getBytes() throws IOException;

    InputStream getInputStream() throws IOException;

    default Resource getResource() {
        return new MultipartFileResource(this);
    }

    void transferTo(File var1) throws IOException, IllegalStateException;

    default void transferTo(Path dest) throws IOException, IllegalStateException {
        FileCopyUtils.copy(this.getInputStream(), Files.newOutputStream(dest));
    }
}

可以把 MultipartFile 替换为 Servlet.http.Part

@RequestMapping("/upload")
public String uploadImage(@RequestPart("picture") Part file) throws IOException {
    // 获取 文件 名
    String filename = file.getSubmittedFileName();
    // 将 上传的文件 写入到 文件系统中
    file.write("/data/image"+filename);
    return "index";
}

通过 Part 参数接收上传文件,那么没有必要 配置 MultipartResolver 了。只有使用 MultipartFile 的时候,才需要 配置。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • minio分布式文件管理方式

    minio分布式文件管理方式

    文章介绍了MinIO作为分布式存储系统,支持大文件存储与数据恢复,通过Docker部署并配置多副本存储,同时涵盖图片/视频上传、断点续传、格式转换(如AVI转MP4)及xxl-job分布式任务调度,强调乐观锁机制和补偿机制确保任务可靠性与数据一致性
    2025-08-08
  • Springboot整合easyexcel实现一个接口任意表的Excel导入导出

    Springboot整合easyexcel实现一个接口任意表的Excel导入导出

    本文主要介绍了Springboot整合easyexcel实现一个接口任意表的Excel导入导出,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • SpringBoot集成 Prometheus进行高效监控的实现

    SpringBoot集成 Prometheus进行高效监控的实现

    Prometheus作为一个开源的监控和告警工具,以其强大的数据采集、存储和查询能力,受到了众多开发者的青睐,本文主要介绍了SpringBoot集成 Prometheus进行高效监控的实现,感兴趣的可以了解一下
    2024-07-07
  • SpringBoot启动慢的优化指南

    SpringBoot启动慢的优化指南

    本摘要基于视频画面字幕与关键帧整理,视频主题是 Spring Boot 应用启动耗时优化,核心观点是:不要一上来盲目加内存、换 SSD、改启动参数,而是先用工具定位启动链路中真正耗时的阶段,再针对性优化,需要的朋友可以参考下
    2026-06-06
  • 浅谈Java四种线程池及new Thread的弊端

    浅谈Java四种线程池及new Thread的弊端

    本文主要介绍了浅谈Java四种线程池及new Thread的弊端,详细的介绍了newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor四种的使用,感兴趣的可以了解一下
    2024-01-01
  • 深入理解Java中的WeakHashMap

    深入理解Java中的WeakHashMap

    这篇文章主要介绍了深入理解Java中的WeakHashMap,WeakHashMap从名字可以得知主要和Map有关,不过还有一个Weak,我们就更能自然而然的想到这里面还牵扯到一种弱引用结构,因此想要彻底搞懂,我们还需要知道四种引用,需要的朋友可以参考下
    2023-09-09
  • 基于java高并发处理方案

    基于java高并发处理方案

    这篇文章主要介绍了基于java高并发处理方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • 五个很实用的IDEA使用技巧分享

    五个很实用的IDEA使用技巧分享

    IntelliJ IDEA 是一款优秀的 Java 集成开发环境,它提供了许多强大的功能和快捷键,可以帮助开发者提高编码效率和质量,本文就在为你介绍博主常用的五个IntelliJ IDEA使用技巧,希望能够给你带来一些工作效率上的提升
    2023-10-10
  • Java设计模式之java组合模式详解

    Java设计模式之java组合模式详解

    这篇文章主要介绍了JAVA设计模式之组合模式,简单说明了组合模式的原理,并结合实例分析了java组合模式的具体用法,需要的朋友可以参考下
    2021-09-09
  • 详解Spring Kafka中关于Kafka的配置参数

    详解Spring Kafka中关于Kafka的配置参数

    这篇文章主要介绍了详解Spring Kafka中关于Kafka的配置参数,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08

最新评论