1,..\web\src\main\resources\spring\web-men-applicationContext.xml
保留原有的bean配置
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- set the max upload size100MB --> <property name="maxUploadSize"> <value>104857600</value> </property> </bean>
2,..\web\WebApplication.java 之前调试过程中,配置了本地bean信息,最终还是删除了,因为无法解决自己加目录/tmp问题
/** * spring boot统一入口 */ @ImportResource({"classpath:spring/web-men-applicationContext.xml"}) public class WebApplication extends MobileBaseApplication {
public static void main(String[] args) { final ConfigurableApplicationContext context = SpringApplication.run(WebApplication.class, args); }
@Bean public FilterRegistrationBean characterEncodingfilter() { OrderedCharacterEncodingFilter filter = new OrderedCharacterEncodingFilter(); filter.setEncoding("UTF-8"); filter.setForceEncoding(true); filter.setForceRequestEncoding(true); filter.setForceResponseEncoding(true); FilterRegistrationBean registration = new FilterRegistrationBean(filter); registration.addUrlPatterns("/*"); return registration; }
@Bean public FilterRegistrationBean corsFilterRegistration() { CorsInterceptor filter = new CorsInterceptor(); FilterRegistrationBean registration = new FilterRegistrationBean(filter); registration.setName("corsFilter"); registration.addUrlPatterns("/*"); return registration; }
/** * 文件上传配置-----最终还是去掉了 */ @Bean public MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); //单个文件最大 factory.setMaxFileSize("10240KB"); //KB,MB /// 设置总上传数据总大小 factory.setMaxRequestSize("102400KB"); factory.setLocation(""); return factory.createMultipartConfig(); }
3,最终解决方式为:springboot基类中,
@EnableAutoConfiguration注解exclude里排除springboot自带的bean
MultipartAutoConfiguration.class
..\common\util\MobileBaseApplication.java
@Configuration @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class , DataSourceTransactionManagerAutoConfiguration.class, JndiDataSourceAutoConfiguration.class, XADataSourceAutoConfiguration.class,MultipartAutoConfiguration.class}) public abstract class MobileBaseApplication extends QggBaseApplication {
}
下面来文字描述下问题的出现和解决思路: 1,@RequestParam("uploadFile") MultipartFile[] files,controller中files的size为0了。 解决方法: 移出掉web-men-applicationContext.xml中的
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- set the max upload size100MB --> <property name="maxUploadSize"> <value>104857600</value> </property> </bean> ,这样就用org.springframework.web.multipart.support包下的transferTo方法,而不是原有自己配置的bean里org.springframework.web.multipart.commons包下的transferTo方法了。
但这引发了另外一个问题,上传文件的目录前被加了个/tmp目录,导致文件上传找不到真实路径。 最终write方法看到是org.eclipse.jetty.util包下MultiPartInputStreamParser类下的属性值 protected File _tmpDir;
this._file = new File(MultiPartInputStreamParser.this._tmpDir, fileName); 由于这么个东西的存在,决定把SpringBoot的统一入口中(WebApplication.java),添加bean,让spring初始化的时候去获取这个bean
/** * 文件上传配置 */ @Bean public MultipartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); //单个文件最大 factory.setMaxFileSize("10240KB"); //KB,MB /// 设置总上传数据总大小 factory.setMaxRequestSize("102400KB"); factory.setLocation(""); return factory.createMultipartConfig(); }
但是还是不行,依然有/tmp出现,debug看到
MultiPartInputStreamParser.class下的parse()方法里this._tmpDir还是会被设置上默认值:
if (this._config.getLocation() == null) { this._tmpDir = this._contextTmpDir; } else if ("".equals(this._config.getLocation())) { this._tmpDir = this._contextTmpDir; } else { File f = new File(this._config.getLocation()); if (f.isAbsolute()) { this._tmpDir = f; } else { this._tmpDir = new File(this._contextTmpDir, this._config.getLocation()); } }
因此认为,不能再让上传文件的transferTo再走到MultiPartInputStreamParser里面。 那么就还是要自己配置bean,而不是走springboot默认的配置。 所以把一切之前的针对文件上传改动还原到springboot升级之前。
要排除掉springboot的自动ioc,..\common.util\MobileBaseApplication.java
@Configuration @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class , DataSourceTransactionManagerAutoConfiguration.class, JndiDataSourceAutoConfiguration.class, XADataSourceAutoConfiguration.class,MultipartAutoConfiguration.class}) public abstract class MobileBaseApplication extends QggBaseApplication {
}
|