研究了4中配置。在这里记录和共享一下。
上一篇springmvc-没有web.xml和springmvc.xml你还可以运行起来springmvc吗介绍了springmvc的搭建以及jar包依赖。
这一次还是延续上一篇的配置,进行下面的配置,建议先看一下前面的配置,以免混淆。
包引入
spring的文件上传需要依赖commons-fileupload和commons-io包,所以先将这两个包引入进来:
compile group: 'commons-logging', name: 'commons-logging', version: '1.2'
compile group: 'commons-collections', name: 'commons-collections', version: '3.2.1'
compile group: 'commons-io', name: 'commons-io', version: '2.4'
compile group: 'commons-fileupload', name: 'commons-fileupload', version: '1.3.1'
compile group: 'commons-codec', name: 'commons-codec', version: '1.10'
jsp文件
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>
上传
这里面的enctype="multipart/form-data"
需要配置。
上传controller
@Controller
public class UploadController {
@RequestMapping(value="/upload",method=RequestMethod.POST,produces="application/json;charset=utf-8")
public @ResponseBody String uploadFile(@RequestParam(value = "files", required = false) MultipartFile file){
try {
FileUtils.writeByteArrayToFile(new File("F:/a/"+file.getOriginalFilename()),file.getBytes());
return "上传成功";
} catch (IOException e) {
e.printStackTrace();
return "上传失败";
}
}
}
说明:
@RequestParam(value = "files", required = false)
values="files" 需要和jsp中的name想对应
produces="application/json;charset=utf-8"
主要是为了防止中文乱码
前面部分的内容可以保持一致,主要看看MultipartResolver
的配置
1.通过xml配置文件
虽然延续上面的一个配置,没有使用任何的xml配置文件,但是也在这里说一下这种配置方式。
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5242880" />
<property name="maxInMemorySize" value="4096" />
<property name="defaultEncoding" value="UTF-8">property>
bean>
这里的bean的id尽量不要变动
2.通过@Bean配置
在@Configuration
下将MultipartResolver 配置进去
/*文件上传配置*/
@Bean
public MultipartResolver multipartResolver(){
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(100*1024*1024);
return multipartResolver;
}
3.通过DispatcherServlet配置
这个类是WebMvcInitializer
,上一篇里面提到的取代web.xml配置文件的类,该类实现了WebApplicationInitializer
接口。在这里配置MultipartConfig也可以实现文件的上传。
/*DispatcherServlet*/
Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
dispatcher.addMapping("/");
dispatcher.setLoadOnStartup(1);
//配置文件上传,也可以在MvcConfig中配置
String location = "F:/a";
long maxFileSize = 50*1024*1024;
long maxRequestSize = 100*1024*1024;
int fileSizeThreshold = 0;
MultipartConfigElement multipartConfigElement = new MultipartConfigElement(location,maxFileSize,maxRequestSize,fileSizeThreshold);
dispatcher.setMultipartConfig(multipartConfigElement);
4.继承AbstractAnnotationConfigDispatcherServletInitializer
这个是从官方文档上面摘下来的。新建一个类ABC,继承AbstractAnnotationConfigDispatcherServletInitializer
类,然后重写customizeRegistration()
方法。
public class Abc extends AbstractAnnotationConfigDispatcherServletInitializer {
/**在这里重写方法*/
@Override
protected void customizeRegistration(ServletRegistration.Dynamic registration) {
String location = "F:/a";
long maxFileSize = 50*1024*1024;
long maxRequestSize = 100*1024*1024;
int fileSizeThreshold = 0;
MultipartConfigElement multipartConfigElement = new MultipartConfigElement(location,maxFileSize,maxRequestSize,fileSizeThreshold);
registration.setMultipartConfig(multipartConfigElement);
}
@Nullable
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[0];
}
/**这里要将@Configuration注解类加入进来*/
@Nullable
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{MvcConfig.class};
}
/**这里要配置拦截所有的请求*/
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
}
完成了上面的步骤,我们发现是不是跟DispatcherServlet
配置重复了呢?
答案是:是的
因为AbstractAnnotationConfigDispatcherServletInitializer
是WebApplicationInitializer
类的子类。我们已经在WebApplicationInitializer
的自定义继承类中配置了DispatcherServlet
,所以两者只能配置一个,否则会报错。所以我们把WebApplicationInitializer
的继承类WebMvcInitializer
中的DispatcherServlet
注释掉。
/**
* 取代web.xml配置文件
*/
public class WebMvcInitializer implements WebApplicationInitializer{
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
//这里不用管
ctx.register(MvcConfig.class);
ctx.setServletContext(servletContext);
/*DispatcherServlet*/
// Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx));
// dispatcher.addMapping("/");
// dispatcher.setLoadOnStartup(1);
//配置文件上传,也可以在MvcConfig中配置
// String location = "F:/a";
// long maxFileSize = 50*1024*1024;
// long maxRequestSize = 100*1024*1024;
// int fileSizeThreshold = 0;
// MultipartConfigElement multipartConfigElement = new MultipartConfigElement(location,maxFileSize,maxRequestSize,fileSizeThreshold);
// dispatcher.setMultipartConfig(multipartConfigElement);
}
}
第4种方案是SpringMvc 5.X官方给出的方案,跟第3中方案基本一样。但是常规配置还是第2中,使用xml的话当然是第一种。根据个人而定吧。
介绍了4种配置方案,接下来启动服务试试看吧