一、springmvc中配置multipartResolver
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 默认编码 -->
<property name="defaultEncoding" value="utf-8"/>
<!-- 文件大小最大值 -->
<property name="maxUploadSize" value="10485760000"/>
<!-- 内存中的最大值 -->
<property name="maxInMemorySize" value="1024"/>
<property name="uploadTempDir" value="temp/tomcat"/>
</bean>
二、如果在后台Controller的java的获取为: MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext()); MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request); MultipartFile file = multipartRequest.getFile("file"); String a1 = multipartRequest.getParameter("a1");
是获取到到文件的。
(一):
1、在spring-config配置了<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> 之后
后台的获取有两种方法:
1、指定@RequestParam MultipartFile file 例如:public Map<String, Object> logsUpload(@RequestParam MultipartFile file,@RequestParam(value="key") String key)参数;
2、将request转化为MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest)(request);
原理是:使用spring的CommosMultipartResolver 配置MultipartResolver 用于文件上传,DispatcherServlet 将调用 MultipartResolver 的 isMultipart(request) 方法检查当前 Web 请求是否为 multipart类型。如果是,DispatcherServlet 将调用 MultipartResolver 的 resolveMultipart(request) 方法,对原始 request 进行装饰,并返回一个 MultipartHttpServletRequest 供后继处理流程使用(最初的 HttpServletRequest 被偷梁换柱成了 MultipartHttpServletRequest),否则,直接返回最初的 HttpServletRequest。也就是说请求一旦被 MultipartResolver 接手,它就会解析请求中的文件,而不必等待后续 controller 主动从 MultipartRequest 中 getFile,所以在配置了MultipartResolver后,再通过这样的方法
MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request);
是获取不到file的,因为控制器已经帮我们进行了转换 直接获取即可。
如果你使用该方法发觉获取没有问题,你可以看看给这个方法是不是配置了servlet,如果配置了servlet是不走这个 MultipartResolver控制,是能获取成功的。
三、如果在过滤器中拦截
request通过ParameterRequestWrapper可以将获取文件
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req= (HttpServletRequest) request;
req.setCharacterEncoding(AppConstants.UTF_8);
/*
paramsMap是获取req里面的参数,并将参数进行各种转换后重新封装到req中
*/
req = new ParameterRequestWrapper(req, paramsMap);
chain.doFilter(req,resp);
}
public class ParameterRequestWrapper extends HttpServletRequestWrapper {
private Map params;
public ParameterRequestWrapper(HttpServletRequest request, Map newParams) {
super(request);
this.params = newParams;
if (request instanceof MultipartHttpServletRequest) {
MultipartHttpServletRequest mReq = (MultipartHttpServletRequest) request;
mReq.setAttribute(HttpConstants._request_files, mReq.getFileMap());
}
}
public Map getParameterMap() {
return params;
}
public Enumeration getParameterNames() {
Vector l = new Vector(params.keySet());
return l.elements();
}
public String[] getParameterValues(String name) {
Object v = params.get(name);
if (v == null) {
return null;
} else if (v instanceof String[]) {
return (String[]) v;
} else if (v instanceof String) {
return new String[] { (String) v };
} else {
return new String[] { v.toString() };
}
}
public String getParameter(String name) {
Object v = params.get(name);
if (v == null) {
return null;
} else if (v instanceof String[]) {
String[] strArr = (String[]) v;
if (strArr.length > 0) {
return strArr[0];
} else {
return null;
}
} else if (v instanceof String) {
return (String) v;
} else {
return v.toString();
}
}
}
controller层中:
Map<String, MultipartFile> chatfileList = (Map<String, MultipartFile>)
request.getAttribute(HttpConstants._request_files);
Set<String> filekey = chatfileList.keySet();
for(Iterator<String> iteror = filekey.iterator();iteror.hasNext();){
MultipartFile chatfile = chatfileList.get(iteror.next());
String fileName = "";
fileName = chatfile.getOriginalFilename();
System.out.println("-------------------ss:" + fileName);
String relativePath = "/data/file";
File fileRoot = new File(relativePath);
if (!fileRoot.exists()) {
fileRoot.mkdir();
}
String fileNewName = ".png");
File fileServer = new File(fileRoot.getPath(), fileNewName);
chatfile.transferTo(fileServer);
}
注意:下面获取不到文件
MultipartHttpServletRequest mReq = (MultipartHttpServletRequest) request; Map<String, MultipartFile> chatfileList= mReq.getFileMap();
因为经过ParameterRequestWrapper转换后,request直接是获取不到multipartFiles了
参考资料:
1、spring的multipartResolver和java后端获取的MultipartHttpServletRequest方法对比 (附:遇到的坑)