springmvc-文件上传配置的几种方式

研究了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配置重复了呢?
答案是:是的

因为AbstractAnnotationConfigDispatcherServletInitializerWebApplicationInitializer类的子类。我们已经在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种配置方案,接下来启动服务试试看吧

你可能感兴趣的:(springmvc)