美图秀秀M4 头像编辑器是一款集旋转裁剪、特效美化、人像美容为一体的在线头像编辑工具。适用于有设置头像需求的BBS、SNS、微博和社区等Web产品。
美图秀秀,JAVA提供了示例可参考,流式上传 或者 标准表单上传,于是采用标准表单上传。
List<FileItem> items = upload.parseRequest(request);//得到所有的文件
以上为截取部分代码,美图的API采用的common-fileupload解析上传操作,但是问题出现了,items获取的值为空,查阅了部分资料,原来是SpringMvc上传配置的锅:
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="1000000000" />
</bean>
把这段代码注释掉,重新上传就可以,但是其他使用到了SpringMvc上传的Controller就不起作用了。
原因
原来springMVC已经为我们封装好成自己的文件对象了,转换的过程就在我们所配置的CommonsMultipartResolver这个转换器。
/**
* Parse the given servlet request, resolving its multipart elements.
* @param request the request to parse
* @return the parsing result
* @throws MultipartException if multipart resolution failed.
*/
protected MultipartParsingResult parseRequest(HttpServletRequest request) throws MultipartException {
String encoding = determineEncoding(request);
FileUpload fileUpload = prepareFileUpload(encoding);
try {
List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);
return parseFileItems(fileItems, encoding);
}
catch (FileUploadBase.SizeLimitExceededException ex) {
throw new MaxUploadSizeExceededException(fileUpload.getSizeMax(), ex);
}
catch (FileUploadBase.FileSizeLimitExceededException ex) {
throw new MaxUploadSizeExceededException(fileUpload.getFileSizeMax(), ex);
}
catch (FileUploadException ex) {
throw new MultipartException("Failed to parse multipart servlet request", ex);
}
}
他的转换器里面就是调用common-fileupload的方式解析,然后再使用parseFileItems()方法封装成自己的文件对象 。
List<FileItem> fileItems = ((ServletFileUpload) fileUpload).parseRequest(request);
上面的这句代码,springMVC已经使用过fileUpload解析过request了,而我们在Controller里面接收到的request已经是解析过的,你再次使用fileupload进行解析获取到的肯定是空,这个就是问题的所在。
解决方案
使用SpringMvc的API进行上传操作,部分伪代码:
String basePath =request.getSession().getServletContext().getRealPath("/file/avatar/");
//上传文件目录
File filePath = new File(basePath);
MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request;
//注意这里获取的是avatar
MultipartFile mf = mRequest.getFile("avatar");
//用户ID做为用户头像的名称
String baseName = userType+"_"+userId;
String newFileName = baseName+"_"+FLAG_L+".jpg";
//输出头像
FileOutputStream fos = new FileOutputStream(filePath + Constant.SF_FILE_SEPARATOR + newFileName);
fos.write(mf.getBytes());fos.flush();fos.close();