当前位置:   article > 正文

Springboot 上传文件 MultipartFile 类型转CommonsMultipartFile报错_multipartfile 转 commonsmultipartfile

multipartfile 转 commonsmultipartfile

我们从根源上找一下问题的所在

首先我们来了解一下MultipartFile 这个类型

MultipartFile

SpringMVC 中,文件的上传,是通过 MultipartResolver 实现的。 所以,如果要实现文件的上传,在SSM的项目中只要在 spring-mvc.xml 中注册相应的 MultipartResolver 即可。

MultipartResolver 的实现类有两个:

  1. CommonsMultipartResolver
  2. StandardServletMultipartResolver

两个的区别:

  1. 第一个需要使用 Apache 的 commons-fileupload 等 jar 包支持,但它能在比较旧的 servlet 版本中使用。
  2. 第二个不需要第三方 jar 包支持,它使用 servlet 内置的上传功能,但是只能在 Servlet 3 以上的版本使用

这点我们可以点到 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 上传文件时懒加载
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

这种类似的配置是无法 配置 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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

注意: 如果你是和我一样在项目的 resources/static 下创建了一个temp 的目录,那么这个目录里要是没有文件的话很有可能会在编译的时候编译不过去,在 target 没有这个目录,此时就会启动报错,这个问题我也一直没有找到有效的办法,只能是在temp目录下随便存了一个文件,这样也能编译过去,将就着将问题解决,如果谁知道好的办法,请指点我一下,谢谢!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/895619
推荐阅读
相关标签
  

闽ICP备14008679号