赞
踩
我们从根源上找一下问题的所在
首先我们来了解一下MultipartFile 这个类型
SpringMVC 中,文件的上传,是通过 MultipartResolver 实现的。 所以,如果要实现文件的上传,在SSM的项目中只要在 spring-mvc.xml 中注册相应的 MultipartResolver 即可。
MultipartResolver 的实现类有两个:
两个的区别:
这点我们可以点到 MultipartFile 的源码可以看一下它的主要实现类
这里这个 MockMultipartFile 暂时先不用去管它,用的不多。
我们主要看剩下的两个,一般我们上传文件主要用到这两个,我比较用的多的是CommonsMultipartResolver。
一般在Spring boot 中自动配置的 MultipartResolver 如下:
# #Spring boot 上传文件
spring:
servlet:
multipart:
max-file-size: 100000MB #file-size 总文件大小 MB 大写
max-request-size: 100000MB #request-size 单个文件大小 MB 大写
enabled: true #是否支持 multipart 上传文件
file-size-threshold: 0 #支持文件写入磁盘
location: /xxx/xxx #上传文件的临时目录
resolve-lazily: false #是否支持 multipart 上传文件时懒加载
这种类似的配置是无法 配置 CommonsMultipartResolver 的
为什么呢?
我们进入自动配置 MultipartResolver 的类
可看到如下代码
可以看到springboot 的自动配置是默认配置的 StandardServletMultipartResolver 这个实现类,所以在如上配置的参数后,转化 CommonsMultipartResolver 就会报错。
当然是剔除默认的配置,自己来配置一下。
@Configuration @EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class}) public class MultipartConfig{ /** * 文件上传配置 * @return */ @Bean(name = "multipartResolver") public MultipartResolver multipartResolver() throws IOException { CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setDefaultEncoding("UTF-8"); resolver.setResolveLazily(true); //resolveLazily属性启用是为了推迟文件解析,以在在UploadAction中捕获文件大小异常 resolver.setMaxInMemorySize(100); resolver.setMaxUploadSize(1024* 1024 * 30);//上传文件大小 30M 30*1024*1024 resolver.setUploadTempDir(new ClassPathResource("/static/temp"));//上传文件临时地址 target 包下没有启动报错 return resolver; } }
注意: 如果你是和我一样在项目的 resources/static 下创建了一个temp 的目录,那么这个目录里要是没有文件的话很有可能会在编译的时候编译不过去,在 target 没有这个目录,此时就会启动报错,这个问题我也一直没有找到有效的办法,只能是在temp目录下随便存了一个文件,这样也能编译过去,将就着将问题解决,如果谁知道好的办法,请指点我一下,谢谢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。