Как использовать CommonsMultipartResolver в Spring Boot

Я попытался использовать CommonsMultipartResolver в Boot, переводя мое старое приложение (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

person Carlos Alberto    schedule 10.06.2015    source источник


Ответы (3)


Это была ошибка в Spring Boot, которая будет исправлена ​​в версии 1.2.5. .

person Phil Webb    schedule 30.06.2015

Во-первых, в классе 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, вам не нужно использовать механизм загрузки общих файлов, а поддержка 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>
person K. Siva Prasad Reddy    schedule 11.06.2015
comment
На самом деле эта конфигурация ошибочна, имя bean-компонента должно быть multipartResolver вместо comonsMultipartResolver, если вы хотите правильную интеграцию с DispatcherServlet. Также фильтр не является обязательным (только если вы комбинируете его с Spring Security). - person M. Deinum; 11.06.2015
comment
В этом классе действительно нет свойства enabled, однако свойство должно соответствовать это, чтобы включить/отключить составную конфигурацию. Так что в основном я считаю, что проблема в составной части конфигурации Spring Boot. Также не все свойства должны иметь соответствующий класс для сопоставления, есть и другие способы использования свойств, определенных в файле application.properties. - person M. Deinum; 11.06.2015
comment
Если вы посмотрите документацию Spring Boot docs .spring.io/spring-boot/docs/current/reference/html/ есть свойство multipart.enabled=true, и там указано значение enable. Почему он существует, если это не так? - person Carlos Alberto; 11.06.2015
comment
multipart.enabled=false используется для отключения многокомпонентной автоконфигурации загрузки github.com/spring-projects/spring-boot/blob/master/ - person tsachev; 26.08.2015

Если вы хотите использовать CommonsMultipartFile для загрузки файла, добавьте @EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class}) в проект Spring Boot. Отключите многокомпонентную конфигурацию в весенней загрузке.

   public RespDataView provisionalMediaUpload(@RequestParam("file") CommonsMultipartFile file,
                                               @RequestParam("type") String type) {}
person 盖思呈    schedule 26.04.2018