环境 : 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); } }
========
欢迎拍砖。
各位大神 如果有更好的方法,请尽管拍过来。