SpringBoot:MultipartResolver 文件上传、大小限制相关配置、实现原理与自定义
基于
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 文件上传、大小限制相关配置、实现原理与自定义相关推荐
- springboot设置文件上传大小(tomcat默认1M)
application.yml # 设置文件上传大小(tomcat默认1M) server:tomcat:max-http-form-post-size: -1 spring:servlet:mult ...
- struts2文件上传大小限制问题小结(引用)
最后解决办法: 页面js控制上传文件的大小,在页面进行控制.如下代码 inputs是所有文本上传input DOM //名称信息var nameStr='';//大小信息var sizeStr=''; ...
- 文件上传到ftp服务器大小变小,ftp服务器文件上传大小设置
ftp服务器文件上传大小设置 内容精选 换一换 文件选择上传控件,用于上传文件. Windows场景中,当把源端服务器迁移到华为云后,目的端服务器C盘的已用空间比对应源端服务器C盘的已用空间大至少1G ...
- springboot 上传图片大小_springboot 文件上传大小配置的方法
springboot上传文件大小的配置我这里记录两种,一种是设置在配置文件里只有两行代码,一种是加个Bean 首先第一种: application.properties中添加 spring.http. ...
- SpringBoot下文件上传与下载的实现
原文:http://blog.csdn.net/colton_null/article/details/76696674 SpringBoot后台如何实现文件上传下载? 最近做的一个项目涉及到文件上传 ...
- SpringBoot实现文件上传接口
作者平台: | CSDN:blog.csdn.net/qq_41153943 | 掘金:juejin.cn/user/651387- | 知乎:www.zhihu.com/people/1024- | ...
- SpringBoot图文教程4—SpringBoot 实现文件上传下载(亲测)
SpringBoot 图文教程系列文章目录 SpringBoot图文教程1「概念+案例 思维导图」「基础篇上」 SpringBoot图文教程2-日志的使用「logback」「log4j」 Spring ...
- springboot改文件头_SpringBoot图文教程4—SpringBoot 实现文件上传下载
有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 文章结尾配套自测面试题,学完技术自我测试更扎实 概念十遍不如代码一遍,朋友,希望你把文中所有的代码案例 ...
- 【SpringBoot学习】5、SpringBoot 实现文件上传,图片上传并显示功能
SpringBoot 实现文件上传,图片上传并显示功能 我先看一下<颈椎病康复指南>再给大家说怎么实现的这两个功能,毕竟只是一个新手,解决这种复杂点的问题(相对而言),还是需要花费大量时间 ...
最新文章
- 《深入理解计算机系统》第十章——系统级I/0
- 2020 年,AI 芯片内存哪家强?
- GitHub重大好消息:私有仓库可无限制免费创建
- VIP群第一期讲座实屏片段摘录
- 我在中关村,给不了的你爱的国贸(ZZ)
- Java8新特性总结 -6.Date/Time API
- 区分三个概念:Epoch, Batch, Iteration
- sql 时间查询 /sql中判断更新或者插入/查询一年所有双休日
- android 工具 lve,Android Studio 4.0 新功能中的Live Layout Inspector详解
- PRML 回归的线性模型
- 京瓷300i_kyocera cs 300i kx驱动下载
- blast 数据库说明
- Docker - 札记 - Cannot connect to the Docker daemon at tcp://localhost:2375. Is the docker daemon runn
- C# 上传本地文件到远程共享文件夹,从远程共享文件夹下载文件到本地
- Nginx安装配置报错详解
- 杀人 真心话大冒险 起底
- oracle使用dblink方法
- 在网页上渲染 Android 的 9-Patch 图像
- 帝国理工读书是种什么体验?
- 英语笔记(单词来自Shiro文档)01
热门文章
- nasa注册_“NASA中文”更名的情况说明
- 字典树原理详解及其Python实现
- java mysql SSM实现的校园门户平台网站系统源码+含开题报告与需求分析+包安装配置
- 电脑重装系统怎么清理c盘空间
- window结束进程命令
- 暴走的Polkadot (DOT)(上)
- 大数据未来发展的七大趋势
- 中国重大铁路事故一览,90年代以前基本都是爆炸事故,90年代以后基本都是追尾事故...
- 记一次微信H5支付失败(网络环境未能通过安全验证,请稍后再试)解决方案
- 支付宝/小钱袋H5支付通道