Spring MVC 处理form表单 上传文件1---配置
在web应用中,用户上传有两种:文本信息和文件(照片,文件,视频等)。这里讲在Spring中(或Servlet容器中)配置好了对mutipart请求的处理,这一步是一劳永逸的;编写form上传文件,编写控制器方法处理上传的文件。编写form和controller方法是经常会用到的。
1.配置multipart解析器---JavaConfig
通过Spring的MultipartResolver接口来解析multipart请求数据。在SpringMVC中,内置了两个MultipartResolver实现类来解析multipart请求。CommonsMultipartResolver和StandardServletMultipartResolver类。Servlet 3.0和Spring3.1之后,StandardServletMultipartResolver类是更优方案。这里就示例配置StandardServletMultipartResolver类。
在Spring应用上下文中,将StandardServletMultipartResolver声明为bean。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.support.StandardServletMultipartResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
@EnableWebMvc // 启用Spring MVC
@ComponentScan("spittr") // 启用组件扫描
public class WebConfig extends WebMvcConfigurerAdapter {
//省略其它配置
@Bean
public MultipartResolver multipartResolver() {
return new StandardServletMultipartResolver();
}
}
2.自定义配置DispatcherServlet来实现multipart配置
通过自定义配置DispatcherServlet 来 限制StandardServletMultipartResolver的工作方式。比如:1.在文件上传的过程中,所写入的临时文件路径;2.上传文件的最大容量(以字节为单位)。默认是没有限制的;3.整个multipart请求的最大容量(以字节为单位),不会关心有多少个part以及每个part的大小。默认是没有限制的;4.在上传的过程中,如果文件大小达到了一个指定最大容量(以字节为单位),将会写入到临时文件路径中(小于这个容量,不会存)。默认值为0,也就是所有上传的文件都会写入到磁盘上。
其实这里就可以参考 Spring MVC高级配置---JavaConfig配置 Servlet,Filter,Listener 自定义DispatcherServlet配置 。这里是配置DispatcherServlet来限制StandardServletMultipartResolver的工作方式。
具体配置如下,示例了两种配置
import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletRegistration.Dynamic;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class SpittrWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
//省略其它配置
// 自定义DispatcherServlet配置
@Override
protected void customizeRegistration(Dynamic registration) {
// 配置Servlet 3.0对multipart的支持,将上传文件的临时存储目录设置在“/tmp/spittr/uploads”中
registration.setMultipartConfig(new MultipartConfigElement("/tmp/spittr/uploads"));
//将上传文件的临时存储目录设置在“/tmp/spittr/uploads”中,限制文件的大小不超过2MB,
//整个请求不超过4MB,而且所有的文件都要写到磁盘中
registration.setMultipartConfig(new MultipartConfigElement("/tmp/spittr/uploads", 2097152, 4194304, 0));
}
}
PS:这种方法要保证保存文件的文件夹是存在的,否则会报错
message Request processing failed; nested exception is org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.io.IOException: The temporary upload location [G:\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\SpringMVCDemo\tmp\spittr\uploads] is not valid
可以手动新建这些不存在的文件夹。