protected HttpServletRequest checkMultipart(HttpServletRequest request) throws MultipartException {
//进行判断,看我们的请求类型是否是我们以multipart开头
//return StringUtils.startsWithIgnoreCase(request.getContentType(), "multipart/");
if (this.multipartResolver != null && this.multipartResolver.isMultipart(request)) {
if (WebUtils.getNativeRequest(request, MultipartHttpServletRequest.class) != null) {
if (DispatcherType.REQUEST.equals(request.getDispatcherType())) {
logger.trace("Request already resolved to MultipartHttpServletRequest, e.g. by MultipartFilter");
}
}
else if (hasMultipartException(request)) {
logger.debug("Multipart resolution previously failed for current request - " +
"skipping re-resolution for undisturbed error rendering");
}
else {
try {
//进行解析并进行封装我们的request请求,StandardMultipartHttpServletRequest
return this.multipartResolver.resolveMultipart(request);
}
catch (MultipartException ex) {
if (request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) != null) {
logger.debug("Multipart resolution failed for error dispatch", ex);
// Keep processing error dispatch with regular request handle below
}
else {
throw ex;
}
}
}
}
// If not returned before: return original request.
return request;
}
使用下面的参数解析器进行解析
调用下面方法来得到文件
//详细
//其实底层就是将我们的请求文件一组一组的封装到了MultiValueMap<String, MultipartFile>当中,根据我们传入的key来获取值
@Override
public List<MultipartFile> getFiles(String name) {
//到MultiValueMap<String, MultipartFile>中根据我们的key去获取(也就是我们的参数,起的名字)
List<MultipartFile> multipartFiles = getMultipartFiles().get(name);
if (multipartFiles != null) {
return multipartFiles;
}
else {
return Collections.emptyList();
}
}
最后再调用我们的FileCopyUtils类的copy方法进行复制到我们的参数中;
思路总结:
先判断我们的Content-Type 是否是以"Multipart开头的",
遍历参数解析器,找到RequestPortMethodArgumentResoulver参数解析器
我们请求中的文件都会保存在我们的MulitValueMap<String,Mulitpart>中,
会根据我们传入的参数名字为key进行寻找,找到我们的value,
最后使用工具类FileCopyUtils的copy方法进行复制到参数