继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

SpringMvc整合美图秀秀M4(头像编辑器)

小柒2012
关注TA
已关注
手记 103
粉丝 1.7万
获赞 2434

作者: 小柒

美图秀秀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();

参考:http://open.web.meitu.com/

分享是快乐的,也见证了个人成长历程,文章大多都是工作经验总结以及平时学习积累,基于自身认知不足之处在所难免,也请大家指正,共同进步。

打开App,阅读手记
10人推荐
发表评论
随时随地看视频慕课网APP