基于

SpringBoot 2.3.2.RELEASE
Spring-web 5.2.8.RELEASE

问题

做上传下载文件时,SpringBoot获取的文件是MultipartFile,不想把文件存到服务器再上传,就使用了下面的方式进行文件流的获取

 MultipartFile file = 来源是浏览器;CommonsMultipartFile cFile = (CommonsMultipartFile) file;DiskFileItem fileItem = (DiskFileItem) cFile.getFileItem();InputStream in = fileItem.getInputStream();

发生下面报错

java.lang.ClassCastException: org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile cannot be cast to org.springframework.web.multipart.commons.CommonsMultipartFileat com.ais.cdc.service.impl.DirFileMappingServiceImpl.store(DirFileMappingServiceImpl.java:255) ~[classes/:na]

其实改成下面也行

 MultipartFile file = 来源是浏览器;InputStream in = file .getInputStream();

但上面报错问题是什么呢,我查了一些资料

org.apache.commons.fileupload包的选择

org.apache.commons.fileupload.disk.DiskFileItem
首先看,这个DiskFileItem是org.apache.commons.fileupload下面的

MultipartResolver文件上传解析接口

这个是一个接口,用于文件上传解析,从Spring3.1开始有两个实现

CommonsMultipartResolver:Apache Commons文件上传

StandardServletMultipartResolver:基于Servlet 3.0的多部分解析

spring.servlet.multipart 相关配置

这些配置后,是给StandardServletMultipartResolver用的,如果自定义了CommonsMultipartResolver,这些配置就会“失效”,或者说“不生效”,为什么呢,还是因为SpringBoot自动装配的默认选择问题,看下一节

spring.servlet.multipart.enabled=true
# 总上传数据大小
spring.servlet.multipart.max-request-size=1GB
# 单文件大小
spring.servlet.multipart.max-file-size=1GB
# 文件达到多少磁盘写入
spring.servlet.multipart.file-size-threshold=100MB
# 直接存服务器的路径
spring.servlet.multipart.location=/home

SpringBoot对multipartResolver的自动装配: MultipartAutoConfiguration

直接贴代码,看下面,说几点:

1.multipartResolver的默认实现StandardServletMultipartResolver:

@Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)这个bean的名字,就是multipartResolver,是生成的StandardServletMultipartResolver,

2.CommonsMultipartResolver是默认不生成的

@ConditionalOnMissingBean({ MultipartConfigElement.class, CommonsMultipartResolver.class }),默认没CommonsMultipartResolver的bean才创建配置

3.spring.servlet.multipart是给StandardServletMultipartResolver用的

所以如果我就要用CommonsMultipartResolver生成bean,spring.servlet.multipart白配

/*** {@link EnableAutoConfiguration Auto-configuration} for multi-part uploads. Adds a* {@link StandardServletMultipartResolver} if none is present, and adds a* {@link javax.servlet.MultipartConfigElement multipartConfigElement} if none is* otherwise defined. The {@link ServletWebServerApplicationContext} will associate the* {@link MultipartConfigElement} bean to any {@link Servlet} beans.* <p>* The {@link javax.servlet.MultipartConfigElement} is a Servlet API that's used to* configure how the server handles file uploads.*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ Servlet.class, StandardServletMultipartResolver.class, MultipartConfigElement.class })
//"spring.servlet.multipart"配置的开启
@ConditionalOnProperty(prefix = "spring.servlet.multipart", name = "enabled", matchIfMissing = true)
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(MultipartProperties.class)
public class MultipartAutoConfiguration {private final MultipartProperties multipartProperties;//"spring.servlet.multipart"配置的引入public MultipartAutoConfiguration(MultipartProperties multipartProperties) {this.multipartProperties = multipartProperties;}//没CommonsMultipartResolver才使用"spring.servlet.multipart"配置@Bean@ConditionalOnMissingBean({ MultipartConfigElement.class, CommonsMultipartResolver.class })public MultipartConfigElement multipartConfigElement() {return this.multipartProperties.createMultipartConfig();}//默认生成StandardServletMultipartResolver @Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)@ConditionalOnMissingBean(MultipartResolver.class)public StandardServletMultipartResolver multipartResolver() {StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());return multipartResolver;}}

自定义multipartResolver

如果不改spring.servlet.multipart前缀,SpringBoot还是会检查报错的,所以改一下

my:servlet:multipart:maxUploadSize: 1073741824maxInMemorySize: 104857600
@Data
@Configuration
@ConfigurationProperties(prefix = "my.servlet.multipart", ignoreUnknownFields = false)
public class MultipartAutoConfiguration {private long maxUploadSize;private int maxInMemorySize;@Bean(name = "multipartResolver")public CommonsMultipartResolver getCommonsMultipartResolver() {CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();multipartResolver.setMaxUploadSize(this.maxUploadSize);multipartResolver.setMaxInMemorySize(this.maxInMemorySize);return multipartResolver;}
}

SpringBoot:MultipartResolver 文件上传、大小限制相关配置、实现原理与自定义相关推荐

  1. springboot设置文件上传大小(tomcat默认1M)

    application.yml # 设置文件上传大小(tomcat默认1M) server:tomcat:max-http-form-post-size: -1 spring:servlet:mult ...

  2. struts2文件上传大小限制问题小结(引用)

    最后解决办法: 页面js控制上传文件的大小,在页面进行控制.如下代码 inputs是所有文本上传input DOM //名称信息var nameStr='';//大小信息var sizeStr=''; ...

  3. 文件上传到ftp服务器大小变小,ftp服务器文件上传大小设置

    ftp服务器文件上传大小设置 内容精选 换一换 文件选择上传控件,用于上传文件. Windows场景中,当把源端服务器迁移到华为云后,目的端服务器C盘的已用空间比对应源端服务器C盘的已用空间大至少1G ...

  4. springboot 上传图片大小_springboot 文件上传大小配置的方法

    springboot上传文件大小的配置我这里记录两种,一种是设置在配置文件里只有两行代码,一种是加个Bean 首先第一种: application.properties中添加 spring.http. ...

  5. SpringBoot下文件上传与下载的实现

    原文:http://blog.csdn.net/colton_null/article/details/76696674 SpringBoot后台如何实现文件上传下载? 最近做的一个项目涉及到文件上传 ...

  6. SpringBoot实现文件上传接口

    作者平台: | CSDN:blog.csdn.net/qq_41153943 | 掘金:juejin.cn/user/651387- | 知乎:www.zhihu.com/people/1024- | ...

  7. SpringBoot图文教程4—SpringBoot 实现文件上传下载(亲测)

    SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+案例 思维导图」「基础篇上」 SpringBoot图文教程2-日志的使用「logback」「log4j」 Spring ...

  8. springboot改文件头_SpringBoot图文教程4—SpringBoot 实现文件上传下载

    有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 文章结尾配套自测面试题,学完技术自我测试更扎实 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例 ...

  9. 【SpringBoot学习】5、SpringBoot 实现文件上传,图片上传并显示功能

    SpringBoot 实现文件上传,图片上传并显示功能 我先看一下<颈椎病康复指南>再给大家说怎么实现的这两个功能,毕竟只是一个新手,解决这种复杂点的问题(相对而言),还是需要花费大量时间 ...

最新文章

  1. 《深入理解计算机系统》第十章——系统级I/0
  2. 2020 年,AI 芯片内存哪家强?
  3. GitHub重大好消息:私有仓库可无限制免费创建
  4. VIP群第一期讲座实屏片段摘录
  5. 我在中关村,给不了的你爱的国贸(ZZ)
  6. Java8新特性总结 -6.Date/Time API
  7. 区分三个概念:Epoch, Batch, Iteration
  8. sql 时间查询 /sql中判断更新或者插入/查询一年所有双休日
  9. android 工具 lve,Android Studio 4.0 新功能中的Live Layout Inspector详解
  10. PRML 回归的线性模型
  11. 京瓷300i_kyocera cs 300i kx驱动下载
  12. blast 数据库说明
  13. Docker - 札记 - Cannot connect to the Docker daemon at tcp://localhost:2375. Is the docker daemon runn
  14. C# 上传本地文件到远程共享文件夹,从远程共享文件夹下载文件到本地
  15. Nginx安装配置报错详解
  16. 杀人 真心话大冒险 起底
  17. oracle使用dblink方法
  18. 在网页上渲染 Android 的 9-Patch 图像
  19. 帝国理工读书是种什么体验?
  20. 英语笔记(单词来自Shiro文档)01

热门文章

  1. nasa注册_“NASA中文”更名的情况说明
  2. 字典树原理详解及其Python实现
  3. java mysql SSM实现的校园门户平台网站系统源码+含开题报告与需求分析+包安装配置
  4. 电脑重装系统怎么清理c盘空间
  5. window结束进程命令
  6. 暴走的Polkadot (DOT)(上)
  7. 大数据未来发展的七大趋势
  8. 中国重大铁路事故一览,90年代以前基本都是爆炸事故,90年代以后基本都是追尾事故...
  9. 记一次微信H5支付失败(网络环境未能通过安全验证,请稍后再试)解决方案
  10. 支付宝/小钱袋H5支付通道