最近在做一个小小的上传功能竟被虐得体无完肤, 在使用tomcat内置的DiskFileUpload获取前台jsp传来的附件参数和其他表单参数, 竟然出现莫名其妙的乱码问题, 即使tomcat的server.xml和web.xml和jsp页面都做了UTF8 encode处理, 可还是有乱码问题!

正当我想到用new String(fileItem.getName().getBytes("GBK"),"UTF-8");这个办法临时解决了乱码问题(想不通怎么会有GBK, 项目所有文件都是UTF8编码的), 好景不长, 又出现了神经问题: 汉字个数为奇数时(从第三位开始), GBK转UTF8, 奇数位的汉字还是乱码, 其他位数转码正常!

后来经过不停折腾和专研, 终于发现了治本的办法: 使用Spring的CommonsMultipartResolver. 下面我想对这两种上传方式做一个对比:

1.传统的Tomcat自带组件DiskFileUpload上传

 DiskFileUpload diskFileUpload = new DiskFileUpload();
List fileItems = diskFileUpload.parseRequest(request);
Iterator iter = fileItems.iterator();
//查找multipart里面的表单值
for( ; iter.hasNext(); ) {
FileItem fileItem = (FileItem) iter.next();
if( fileItem.isFormField() == true) {
//获取表单数值
}
else {
//获取附件对象
}
}

由于使用了multipart/formdata提交数据, spring mvc是无法轻易获得输入参数, 必须获得fileItem列表, 在递归查找, 很麻烦!

2. Spring的CommonsMultipartResolver上传

先在配置文件进行注入:

1 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
2 p:defaultEncoding="UTF-8"
3 p:maxUploadSize="5400000"
4 p:uploadTempDir="hkrsImage/Appeal" >
5 </bean>

注意: 使用这个配置, 还必须在项目中引用common.fileupload组件.

然后在mvc 方法加上输入参数@RequestParam("pic") MultipartFile picFile, 注意pic就是前台传来的附件对象.

有了最起码的CommonsMultipartResolver对象注入, 它可以让mvc方法能够正常映射前台页面传来的参数, 使用MultipartFile对象里的是transferTo方法能方便地保存附件到本地, 而且还能完美解决乱码问题.

DiskFileUpload上传与Spring的CommonsMultipartResolver上传对比的更多相关文章

  1. 利用spring的CommonsMultipartResolver上传文件

    1.CommonsMultipartResolver是spring里面提供的一个上传方式,效率我不知道,但是加入spring容器管理还是很不错的. 2.先看依赖包pom.xml <project ...

  2. spring mvc CommonsMultipartResolver上传文件异常处理

    近期已经上线的项目出现了一个异常 严重: Servlet.service() for servlet JeeCmsAdmin threw exception org.apache.commons.fi ...

  3. Spring CommonsMultipartResolver上传文件小结

    自从业至今,文件上传与IO流之类的调用,一直是理解比较模糊的地方,大多就这网上搜到的资料抄抄改改草草了事,内部原理一直不甚了解,今日我们通过Spring的CommonsMultipartResolve ...

  4. spring mvc文件上传(单个文件上传|多个文件上传)

    单个文件上传spring mvc 实现文件上传需要引入两个必须的jar包    1.所需jar包:                commons-fileupload-1.3.1.jar       ...

  5. spring mvc(注解)上传文件的简单例子

    spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...

  6. Spring mvc 文件上传到文件夹(转载+心得)

    spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...

  7. 文件上传和下载(可批量上传)——Spring(三)

    在文件上传和下载(可批量上传)——Spring(二)的基础上,发现了文件下载时,只有在Chrome浏览器下文件名正常显示,还有发布到服务器后,不能上传到指定的文件夹目录,如上传20160310.txt ...

  8. 文件上传和下载(可批量上传)——Spring(二)

    针对SpringMVC的文件上传和下载.下载用之前“文件上传和下载——基础(一)”的依然可以,但是上传功能要修改,这是因为springMVC 都为我们封装好成自己的文件对象了,转换的过程就在我们所配置 ...

  9. Spring MVC 笔记 —— Spring MVC 文件上传

    文件上传 配置MultipartResolver <bean id="multipartResolver" class="org.springframework.w ...

随机推荐

  1. ajax技术整理总结(1)

    1.创建ajax对象 var xhr=new XMLHttpRequest(); 4.监听状态信息 xhr.onreadystatechange=function(){ //4接收完毕 ){ docu ...

  2. (转)USB的描述符及各种描述符之间的依赖关系

    全文链接:http://justmei.blog.163.com/blog/static/11609985320102421659260/?latestBlog 1 推荐 [原创] USB入门系列之七 ...

  3. linux常用命令一些解释

    ls 命令是linux下最常用的命令.ls命令就是list的缩写缺省下ls用来打印出当前目录的清单如果ls指定其他目录那么就会显示指定目录里的文 件及文件夹清单. 通过ls 命令不仅可以查看li ...

  4. Centos 6.4搭建git服务器【转】

    前阵子公司需要,让我搭个Git服务器,把之前用的SVN上代码迁移到git上去,所以就在阿里云主机上搭了一个,记录了下安装过程,留存文档以备查阅.本篇本章只涉及搭建部分的操作,更多git的使用可以参考文 ...

  5. CentOS中搭建Redis伪分布式集群【转】

    解压redis 先到官网https://redis.io/下载redis安装包,然后在CentOS操作系统中解压该安装包: tar -zxvf redis-3.2.9.tar.gz 编译redis c ...

  6. shell脚本自带变量的含义

    $0 Shell本身的文件名 $1-$n 添加到Shell的各参数值.$1是第1参数.$2是第2参数… $$ Shell本身的PID(ProcessID) $! Shell最后运行的后台Process ...

  7. learnyounode 题解

    //第三题 var fs =require('fs')var path=process.argv[2]fs.readFile(path,function(err,data){ var lines=da ...

  8. LightOJ 1319 Monkey Tradition(中国剩余定理)

    题目链接:https://vjudge.net/contest/28079#problem/U 题目大意:给你n(n<12)行,每行有pi,ri,求一个数ans满足ans%pi=ri(i从1~n ...

  9. csu 1803(余数分类)

    1803: 2016 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 565  Solved: 364[Submit][Status][Web Board ...

  10. list列表常用方法

    列表是Python中常用的功能,我们知道,列表可以用来存储很多信息,掌握列表的功能有助于我们处理更多的问题,下面来看看列表都具有那些属性:     1.append(self,p_object) de ...