MutlipartResolver负责处理multipart/form-data类型的请求,spring mvc本身没有提供技术实现,而是依赖于其他技术。
MultipartResolver有两个实现类,其中CommonsMultipartResolver依赖于Apache Commons File upload,在使用时需要导入commons-io架包
StandardServletMultipartResolver依赖于原生的Servlet技术。
处理multipart/form-data数据的核心是获取请求中的输入流,当获取到输入流之后,后续的操作视具体的业务而定,如果是文件上传的请求,把输入流写到服务器的磁盘即可
1、CommonsMultipartResolver
使用CommonsMultipartResolver,获取请求的输入流是通过获取MultiPartFile对象,直接写在方法的参数中即可。
使用步骤如下:
第一步,创建CommonsMultipartResolver对象,注入到容器中,名称为multipartResolver
@Bean(name="multipartResolver") public MultipartResolver getMultipartResolver() throws IOException { // 创建对象 CommonsMultipartResolver multipart = new CommonsMultipartResolver(); // 设置属性值 // 设置默认的编码格式 multipart.setDefaultEncoding("UTF-8"); // 5GB multipart.setMaxInMemorySize(5 * 1024 * 1024 * 1024); // 设置上传文件的大小 multipart.setMaxInMemorySize(25 * 1024 * 1024 * 1024); // 设置单个上传文件的最大值,20M multipart.setMaxUploadSizePerFile(20 * 1024 * 1024); // 设置是否延迟解析multipart请求 multipart.setResolveLazily(false); // 设置文件存放的临时目录 Resource tempDir = new FileSystemResource(""); multipart.setUploadTempDir(tempDir); return multipart; }
第二步,在Controller,在处理文件上传请求中添加Multipart参数。之后调用MultipartFile对象的API即可。
@PostMapping("/test/upload") public String handleFileUpload(@RequestParam("testFile") MultipartFile file) { return ""; }
2、StandardServletMultipartResolver
使用StandardServletMultipartResolver,获取请求输入流是通过Part对象,直接写在参数中即可
使用步骤如下:
第一步,创建StandardServletMultipartResolver对象,并注入,名称为multipartResolver
@Bean(name="multipartResolver") public MultipartResolver getMultipartResolver() throws IOException { return new StandardServletMultipartResolver(); }
第二步,在DispatcherServlet中添加multiConfig配置。MultipartConfigElement对象的所有属性都是通过构造器方式传入的。没有setXXX方法。
// 配置DispatcherServlet // 创建DispatcherServlet对象 DispatcherServlet dp = new DispatcherServlet(context); // 获取它的配置信息类,等价于在web.xml中配置servlet-name和servlet-class标签 ServletRegistration.Dynamic registration = servletContext.addServlet("dispatcherServlet", dp); // Multipart配置对象 MultipartConfigElement multipartConfig = new MultipartConfigElement("D:\\tempDir"); registration.setMultipartConfig(multipartConfig);
第三步,在Controller,在处理文件上传请求中添加Part参数。