环境 : springmvc
今天 用 kindeditor 上传图片的时候 遇到一个问题
按照 kindedirot 提供的例子进行图片的上传
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("UTF-8");
List items = upload.parseRequest(request);
在
List items = upload.parseRequest(request);
的时候 得到的 items 为空
这个问题比较 蛋疼,
看application 中的配置
<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="1024000000" /> </bean>
其中 CommonsMultipartResolver 类中有一个
public boolean isMultipart(HttpServletRequest request) {
return request != null && ServletFileUpload.isMultipartContent(request);
}
在
MultipartFilter 中
@Override
protected void doFilterInternal(
HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
MultipartResolver multipartResolver = lookupMultipartResolver(request);
HttpServletRequest processedRequest = request;
if (multipartResolver.isMultipart(processedRequest)) {
if (logger.isDebugEnabled()) {
logger.debug("Resolving multipart request [" + processedRequest.getRequestURI() +
"] with MultipartFilter");
}
processedRequest = multipartResolver.resolveMultipart(processedRequest);
}
else {
if (logger.isDebugEnabled()) {
logger.debug("Request [" + processedRequest.getRequestURI() + "] is not a multipart request");
}
}
try {
filterChain.doFilter(processedRequest, response);
}
finally {
if (processedRequest instanceof MultipartHttpServletRequest) {
multipartResolver.cleanupMultipart((MultipartHttpServletRequest) processedRequest);
}
}
}
将 request 转换为 MultipartHttpServletRequest (StandardMultipartHttpServletRequest)
----------------------------------
/**
* Create a new StandardMultipartHttpServletRequest wrapper for the given request.
* @param request the servlet request to wrap
* @throws MultipartException if parsing failed
*/
public StandardMultipartHttpServletRequest(HttpServletRequest request) throws MultipartException {
super(request);
try {
Collection<Part> parts = request.getParts();
MultiValueMap<String, MultipartFile> files = new LinkedMultiValueMap<String, MultipartFile>(parts.size());
for (Part part : parts) {
String filename = extractFilename(part.getHeader(CONTENT_DISPOSITION));
if (filename != null) {
files.add(part.getName(), new StandardMultipartFile(part, filename));
}
}
setMultipartFiles(files);
}
catch (Exception ex) {
throw new MultipartException("Could not parse multipart servlet request", ex);
}
}
但是 在 List items = upload.parseRequest(request); 中 需要的 request 是 HttpServletRequest 所以 这里得到的list 为空
==============================================
解决方法 有两个
1. 定义一个filter 名字为 filterMultipartResolver 并且放到 spring mvc 的filter 以前
2. 重写 org.springframework.web.multipart.commons.CommonsMultipartResolver 类中的
isMultipart 方法
例如 通过 kindeditor 过来的 请求 都有 一个默认参数 dir
public class MyCommonsMultipartResolver extends CommonsMultipartResolver {
private static final Logger log = Logger.getLogger(MyCommonsMultipartResolver.class);
@Override
public boolean isMultipart(HttpServletRequest request) {
String dir = request.getParameter("dir");
if(dir!=null){ // kindeditor 上传图片的时候 不进行request 的转换
return false;
}
return super.isMultipart(request);
}
}
========
欢迎拍砖。
各位大神 如果有更好的方法,请尽管拍过来。