【问题标题】:How to use CommonsMultipartResolver in Spring Boot如何在 Spring Boot 中使用 CommonsMultipartResolver
【发布时间】:2015-08-26 09:47:22
【问题描述】:

我曾尝试在 Boot 中使用 CommonsMultipartResolver 将我的旧应用程序 (WAR) 转换为 Boot,现在它得到了以下代码:

@Configuration
    public class TestConfig {

        @Bean
        public FilterRegistrationBean openEntityManagerFilterRegistrationBean() {
            // Set upload filter
            final MultipartFilter multipartFilter = new MultipartFilter();
            final FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(multipartFilter);
            filterRegistrationBean.addInitParameter("multipartResolverBeanName", "commonsMultipartResolver");

            return filterRegistrationBean;
        }

        @Bean
        public CommonsMultipartResolver commonsMultipartResolver() {
            final CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
            commonsMultipartResolver.setMaxUploadSize(-1);

            return commonsMultipartResolver;
        }
    }

这是在 Boot 中正确的方式吗,因为我看到一些属性要在 application.properties 中应用。它们与定义 FilterRegistrationBean 的目的是否相同?

# MULTIPART (MultipartProperties)
multipart.enabled=true
multipart.file-size-threshold=0 # Threshold after which files will be written to disk.
multipart.location= # Intermediate location of uploaded files.
multipart.max-file-size=1Mb # Max file size.
multipart.max-request-size=10Mb # Max request size.

谁能提供任何示例如何使用它?谢谢。

顺便说一句,它试图设置属性“multipart.enabled=true”,我得到了:

Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'enabled' of bean class [org.springframework.boot.autoconfigure.web.MultipartProperties]: Bean property 'enabled' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:1076)
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:927)
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:95)
    at org.springframework.validation.DataBinder.applyPropertyValues(DataBinder.java:749)
    at org.springframework.validation.DataBinder.doBind(DataBinder.java:645)
    at org.springframework.boot.bind.RelaxedDataBinder.doBind(RelaxedDataBinder.java:121)
    at org.springframework.validation.DataBinder.bind(DataBinder.java:630)
    at org.springframework.boot.bind.PropertiesConfigurationFactory.doBindPropertiesToTarget(PropertiesConfigurationFactory.java:253)
    at org.springframework.boot.bind.PropertiesConfigurationFactory.bindPropertiesToTarget(PropertiesConfigurationFactory.java:227)
    at org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.postProcessBeforeInitialization(ConfigurationPropertiesBindingPostProcessor.java:296)
    ... 73 common frames omitted

【问题讨论】:

    标签: java spring spring-boot apache-commons


    【解决方案1】:

    如果你想使用CommonsMultipartFile上传文件,请在你的spring boot项目中添加@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class})。在spring boot中禁用多部分配置。

       public RespDataView provisionalMediaUpload(@RequestParam("file") CommonsMultipartFile file,
                                                   @RequestParam("type") String type) {}
    

    【讨论】:

      【解决方案2】:

      这是 Spring Boot 中的 bug,将在 1.2.5 中修复。

      【讨论】:

        【解决方案3】:

        首先,org.springframework.boot.autoconfigure.web.MultipartProperties 类中没有 enabled 属性。

        参考https://github.com/spring-projects/spring-boot/blob/master/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/MultipartProperties.java

        如果您使用的是 Servlet 3 容器,则无需使用 commons-fileupload 机制,并且默认启用 Multipart 支持。如果您不想自定义任何多部分默认配置,则也无需在 application.properties 中添加任何配置。

        <form method="post" action="upload" enctype="multipart/form-data">
          File: <input type="file" name="file"/>
          <input type="submit" value="Submit"/>
        </form>
        
        @RequestMapping(value="/upload", method=RequestMethod.POST)
        public String upload(@RequestPart("file") MultipartFile multipartFile)
        {
            System.out.println(multipartFile.getOriginalFilename());
            return "redirect:/";
        }
        

        如果你想使用 commons-fileupload,那么添加以下配置就可以了:

        package demo;
        
        import org.springframework.boot.SpringApplication;
        import org.springframework.boot.autoconfigure.SpringBootApplication;
        import org.springframework.boot.context.embedded.FilterRegistrationBean;
        import org.springframework.context.annotation.Bean;
        import org.springframework.web.multipart.commons.CommonsMultipartResolver;
        import org.springframework.web.multipart.support.MultipartFilter;
        
        @SpringBootApplication
        public class BootDemoApplication {
        
            public static void main(String[] args) {
                SpringApplication.run(BootDemoApplication.class, args);
            }
        
            @Bean
            public CommonsMultipartResolver commonsMultipartResolver() {
                final CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
                commonsMultipartResolver.setMaxUploadSize(-1);
                return commonsMultipartResolver;
            }
        
            @Bean
            public FilterRegistrationBean multipartFilterRegistrationBean() {
                final MultipartFilter multipartFilter = new MultipartFilter();
                final FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(multipartFilter);
                filterRegistrationBean.addInitParameter("multipartResolverBeanName", "commonsMultipartResolver");
                return filterRegistrationBean;
            }
        }
        

        当然我们需要添加 commons-fileupload 依赖。

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        

        【讨论】:

        • 实际上配置有缺陷,如果你想与DispatcherServlet正确集成,bean的名称应该是multipartResolver而不是comonsMultipartResolver。过滤器也不是强制性的(仅当您将其与 Spring Security 结合使用时)。
        • 该类中确实没有enabled 属性,但是该属性应与this 匹配以启用/禁用多部分配置。所以基本上我认为这是 Spring Boot 的多部分配置部分中的一个问题。此外,并非所有属性都需要映射到相应的类,还有其他使用 application.properties 文件中定义的属性的方法。
        • 如果您查看 Spring Boot 文档docs.spring.io/spring-boot/docs/current/reference/html/… 有一个属性“multipart.enabled=true”,其中显示启用值。如果它无效,为什么它存在?
        • "multipart.enabled=false" 用于禁用启动的多部分自动配置github.com/spring-projects/spring-boot/blob/master/…
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-23
        • 1970-01-01
        • 2021-06-19
        • 2020-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多