错误信息: Corrupt form data: premature ending

最近要实现文件上传功能,需要使用O’Reilly公司的cos上传组件,但是这个组件太过久远,最近更新是08年,早期的spring版本支持,现在已经不支持了,好在它是开源的,我根据spring早期版本里的源码自己实现了。但是出现了错误:Corrupt form data: premature ending,网上找到很多都是struts上的错误,原因是request被过滤了,cos只能接受HttpServletRequest,但在spring-boot中也有这个问题,spring-boot虽然节省了我们很多的配置工作,但也无形中为我们做了很多可能我们不需要的配置。

声明MultipartResolver

spring默认支持两种上传方式,一个是基于Servlet3.0StandardServletMultipartResolver,一个是基于commonsCommonsMultipartResolver。在spring-boot中,会默认帮我们声明StandardServletMultipartResolver,要想更改成commons,需要在spring-boot中包含主函数的类中修改成如下代码:

 1@Configuration
 2//exclude表示自动配置时不包括Multipart配置
 3@EnableAutoConfiguration(exclude={MultipartAutoConfiguration.class})
 4@ComponentScan("com.essa")
 5public class UploadApplication extends WebMvcConfigurerAdapter {
 6
 7	public static void main(String[] args) {
 8		SpringApplication.run(UploadApplication.class, args);
 9	}
10
11    //显式声明CommonsMultipartResolver为mutipartResolver
12	@Bean(name="multipartResolver")
13	public MultipartResolver mutipartResolver() {
14		CommonsMultipartResolver com = new CommonsMultipartResolver();
15		com.setDefaultEncoding("utf-8");
16		return com;
17	}
18}

使用MultipartResolver

若表单的提交方式为multipart/form-data,spring会将request根据声明的mutipartResolver转换为对应的MultipartHttpServletRequest,我们也可以在代码中这样做:

1MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request;

如此,我们就能使用mRequest得到上传文件:

1MultipartFile getFile(String name);         
2List<MultipartFile> getFiles(String name);  
3Map<String, MultipartFile> getFileMap();

得到的类型为MultipartFile,里面封装了File的各种信息。

3. 最后

综上,作为spring的新项目,spring-boot还是很人性化的,只是我现在还没研究透它,它确实为项目开发提供了更加快速简洁的方法。

-END-