spring mvc整合kindeditor文件上传问题

环境 : 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);
	}

}

 ========

欢迎拍砖。

各位大神 如果有更好的方法,请尽管拍过来。

 

 

 

 

 

 

你可能感兴趣的:(spring mvc)