总结:MulitpartResolver用于处理上传请求,springmvc没有默认的配置如果需要使用需要手动配置。

MulitpartResolver中总共有​三个方法​(判断是不是上传请求、将request包装成MultipartHttpServletRequest、清除上传过程中产生的临时资源),​两个实现类​(一个Servlet 3.0,一个基于commons-upload)。

一、MulitpartResolver接口中三个方法:

public interface MultipartResolver {

/**

* 判定是不是上传请求"multipart/form-data"

*/

boolean ​isMultipart​(HttpServletRequest request);


/**

* 将http请求解析成multipart文件及参数

*/

MultipartHttpServletRequest ​resolveMultipart​(HttpServletRequest request) throws MultipartException;


/**

* 清除上传中的临时文件

*/

void ​cleanupMultipart​(MultipartHttpServletRequest request);

}

二、两个默认的实现类

1)基于Servlet 3.0的StandardServletMultipartResolver

public class ​StandardServletMultipartResolver ​implements MultipartResolver {

private boolean resolveLazily = false;//默认false,立即

public void setResolveLazily(boolean resolveLazily) {

this.resolveLazily = resolveLazily;

}

@Override

public boolean isMultipart(HttpServletRequest request) {

if (!"post".equals(request.getMethod().toLowerCase())) {

return false;

}

String contentType = request.getContentType();

return (contentType != null && contentType.toLowerCase().startsWith("multipart/"));

}

@Override

public MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException {

//StandardMultipartHttpServletRequest的实现后面会介绍

return new StandardMultipartHttpServletRequest(request, this.resolveLazily);

}

@Override

public void cleanupMultipart(MultipartHttpServletRequest request) {

try {

for (Part part : request.getParts()) {

if (request.getFile(part.getName()) != null) {

part.delete();

}

}

}

catch (Exception ex) {

LogFactory.getLog(getClass()).warn("Failed to perform cleanup of multipart items", ex);

}

}

}

2)基于common-upload组件

public class ​CommonsMultipartResolver ​extends CommonsFileUploadSupport

implements MultipartResolver, ServletContextAware {


private boolean resolveLazily = false;


public CommonsMultipartResolver() {

super();

}

public CommonsMultipartResolver(ServletContext servletContext) {

this();

setServletContext(servletContext);

}

public void setResolveLazily(boolean resolveLazily) {

this.resolveLazily = resolveLazily;

}

@Override

protected FileUpload newFileUpload(FileItemFactory fileItemFactory) {

return new ServletFileUpload(fileItemFactory);

}


@Override

public void setServletContext(ServletContext servletContext) {

if (!isUploadTempDirSpecified()) {

getFileItemFactory().setRepository(WebUtils.getTempDir(servletContext));

}

}



@Override

public boolean isMultipart(HttpServletRequest request) {

return (request != null && ServletFileUpload.isMultipartContent(request));

}


@Override

public MultipartHttpServletRequest resolveMultipart(final HttpServletRequest request) throws MultipartException {

Assert.notNull(request, "Request must not be null");

if (this.resolveLazily) {

return new DefaultMultipartHttpServletRequest(request) {

@Override

protected void initializeMultipart() {

MultipartParsingResult parsingResult = parseRequest(request);

setMultipartFiles(parsingResult.getMultipartFiles());

setMultipartParameters(parsingResult.getMultipartParameters());

setMultipartParameterContentTypes(parsingResult.getMultipartParameterContentTypes());

}

};

}

else {

MultipartParsingResult parsingResult = parseRequest(request);

return new DefaultMultipartHttpServletRequest(request, parsingResult.getMultipartFiles(),

parsingResult.getMultipartParameters(), parsingResult.getMultipartParameterContentTypes());

}

}

protected MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException {

String encoding = determineEncoding(request);

FileUpload fileUpload = prepareFileUpload(encoding);

try {

List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);

return parseFileItems(fileItems, encoding);

}

catch (FileUploadBase.SizeLimitExceededException ex) {

throw new MaxUploadSizeExceededException(fileUpload.getSizeMax(), ex);

}

catch (FileUploadBase.FileSizeLimitExceededException ex) {

throw new MaxUploadSizeExceededException(fileUpload.getFileSizeMax(), ex);

}

catch (FileUploadException ex) {

throw new MultipartException("Failed to parse multipart servlet request", ex);

}

}

protected String determineEncoding(HttpServletRequest request) {

String encoding = request.getCharacterEncoding();

if (encoding == null) {

encoding = getDefaultEncoding();

}

return encoding;

}

@Override

public void cleanupMultipart(MultipartHttpServletRequest request) {

if (request != null) {

try {

cleanupFileItems(request.getMultiFileMap());

}

catch (Throwable ex) {

logger.warn("Failed to perform multipart cleanup for servlet request", ex);

}

}

}

}