Spring如何获取form中上传的文件呢,Servlet3.0之前的版本,和Servlet3.0是有差别的
请看这段注释
/** * Standard implementation of the {@link MultipartResolver} interface, * based on the Servlet 3.0 {@link javax.servlet.http.Part} API. * To be added as "multipartResolver" bean to a Spring DispatcherServlet context, * without any extra configuration at the bean level (see below). * *Note: In order to use Servlet 3.0 based multipart parsing, * you need to mark the affected servlet with a "multipart-config" section in * {@code web.xml}, or with a {@link javax.servlet.MultipartConfigElement} * in programmatic servlet registration, or (in case of a custom servlet class) * possibly with a {@link javax.servlet.annotation.MultipartConfig} annotation * on your servlet class. Configuration settings such as maximum sizes or * storage locations need to be applied at that servlet registration level; * Servlet 3.0 does not allow for them to be set at the MultipartResolver level. * * @author Juergen Hoeller * @since 3.1 */
org.springframework.web.multipart.support.StandardServletMultipartResolver
Servlet3.0及以后,可以用这个StandardServletMultipartResolver来处理上传文件
org.springframework.web.multipart.commons.CommonsMultipartResolver
而3.0之前的版本通常用的是CommonsMultipartResolver来处理
这两者有什么区别呢,新版是基于Servlet3.0的API实现的,旧版是基于Apache Commons FileUpload实现的
两者使用的时候配置也是不同的,老版的CommonsMultipartResolver可以在用的时候配置,而新版的StandardServletMultipartResolver必须在注册Servlet的时候就进行配置。
CommonsMultipartResolver resolver = new CommonsMultipartResolver(); resolver.setMaxInMemorySize(maxInMemorySize); resolver.setMaxUploadSize(maxUploadSize); resolver.setDefaultEncoding(defaultEncoding); resolver.setUploadTempDir(uploadTempDir);
基于Apache Commons FileUpload的CommonsMultipartResolver的相关配置网上有很多
通常可以在MultipartResolver的级别进行配置
* In order to use Servlet 3.0 based multipart parsing, * you need to mark the affected servlet with a "multipart-config" section in * {@code web.xml}, or with a {@link javax.servlet.MultipartConfigElement} * in programmatic servlet registration, or (in case of a custom servlet class) * possibly with a {@link javax.servlet.annotation.MultipartConfig} annotation * on your servlet class. Configuration settings such as maximum sizes or * storage locations need to be applied at that servlet registration level; * Servlet 3.0 does not allow for them to be set at the MultipartResolver level.
但是基于Servlet3.0的API实现的StandardServletMultipartResolver需要在web.xml或者在配置Servlet的时候进行配置,不允许在MultipartResolver的级别进行配置。
你可以在注册Servlet的时候加入一个javax.servlet.MultipartConfigElement来进行配置,或者使用javax.servlet.annotation.MultipartConfig注解在servlet类中进行配置。
比如这样:
ServletRegistration.Dynamic registration = container.addServlet("dispatcher", dispatcherServlet); MultipartConfigElement config = new MultipartConfigElement(BaseConst.UPLOAD_FOLDER, 8000L, 8000L, 0); registration.setMultipartConfig(config); registration.setLoadOnStartup(1); registration.addMapping("/");
配置了上传文件最大不超过8Kb
import org.springframework.web.multipart.MultipartResolver; import org.springframework.web.multipart.support.StandardServletMultipartResolver;
@Bean public MultipartResolver multipartResolver(){ StandardServletMultipartResolver resolver = new StandardServletMultipartResolver(); return resolver; }
配置完后在ApplicationContext中实例化一个StandardServletMultipartResolver就可以了
@Service("getUploadFile") public class GetUploadFile { @Autowired private MultipartResolver multipartResolver; public void handleUploadFile(HttpServletRequest request) { MultipartHttpServletRequest multipartRequest = multipartResolver.resolveMultipart(request); multipartRequest.getFileNames().forEachRemaining(name -> { MultipartFile file = multipartRequest.getFile(name); file.getInputStream();//do something file.getBytes();//do something }); } }
这是使用的例子,非常方便,新老版本没什么区别。
import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import org.springframework.web.multipart.MultipartResolver; @Service("getUploadFile") public class GetUploadFileimplements IGetUploadFile { @Autowired private MultipartResolver multipartResolver; @Override public List getUploadFile(HttpServletRequest request, IMultipartFileHandler handler) { MultipartHttpServletRequest multipartRequest = multipartResolver .resolveMultipart(request); List uploadFiles = new ArrayList<>(); multipartRequest.getFileNames().forEachRemaining(name -> { MultipartFile file = multipartRequest.getFile(name); T entity = handler.handle(file); uploadFiles.add(entity); }); return uploadFiles; } }
import java.util.List; import javax.servlet.http.HttpServletRequest; public interface IGetUploadFile{ /** * get upload files and process * return the result list * as the process method being offered: IMultipartFileHandler * @param request * @param handler * @return */ public List getUploadFile(HttpServletRequest request, IMultipartFileHandler handler); }
import org.springframework.web.multipart.MultipartFile; @FunctionalInterface public interface IMultipartFileHandler{ public T handle(MultipartFile file); }
封装成接口来使用,代码更简洁,更易读。
@Autowired private IGetUploadFileiGetUploadFile;
只需注入一下,就可以复用代码,获取上传的文件了。
以上