解决方法就是这段代码,其中item是fileupload中的FileItem
String value = new String(item.getString().getBytes("ISO-8859-1"), "UTF-8") ;
但是说老实话,这个解决方法不具有通用性,换个环境很可能就不能用了,比如刚才,我用到smartupload上,就给我来了个exception
1、获取form中字段(即除了上传的文件以外的那些元素)是中文,如果出现了乱码,使用了如下代码,解决了乱码的问题
String value = item.getString("UTF-8");
2、如果上传的文件名是中文,如果出现了乱码,只要设置了request.setCharacterEncoding("UTF-8")就可以解决
完整代码如下:
submit.html
Insert title here
display.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%><%@ page import="org.apache.commons.fileupload.*" %><%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %><%@ page import="org.apache.commons.fileupload.servlet.*" %><%@ page import="java.util.List" %><%@ page import="java.util.Iterator;" %>Insert title here <% request.setCharacterEncoding("UTF-8") ;%><% DiskFileItemFactory factory = new DiskFileItemFactory() ; ServletFileUpload upload = new ServletFileUpload(factory) ; upload.setFileSizeMax(3 * 1024 * 1024) ; // 单个文件大小3M封顶 Listitems = upload.parseRequest(request) ; // 接收全部内容 Iterator iter = items.iterator() ; while(iter.hasNext()){ FileItem item = iter.next() ; String fieldName = item.getFieldName() ; // 取得表单控件的名称%> <% }%>
<%=fieldName%> --> <%=item.isFormField()%>
<% if(!item.isFormField()){ // 不是普通文本 String fileName = item.getName() ; // 取得文件的名称 String contentType = item.getContentType() ; // 文件类型 long sizeInBytes = item.getSize() ;%>- 上传文件名称:<%=fileName%>
- 上传文件类型:<%=contentType%>
- 上传文件大小:<%=sizeInBytes%> bytes<% } else { String value = item.getString("UTF-8");%>
- 普通参数:<%=value%><% }%>
上传成功,返回
下面是在网上找到的资料:
-------------------------------------
最近一直在整上传图片的东西,改了很长时间,实验了3,4种方法,最终还是选择了commons fileupload这个上传组件~~
最后阶段出现的乱码很严重,不仅有文件名称的中文乱码,还有非文件的表单字段的乱码,也查了好多前辈的资料,最后的已解决。改动如下,和大家共享:首先说明下我用的组建方法
DiskFileItemFactory dfif = new DiskFileItemFactory();ServletFileUpload sfu = new ServletFileUpload(dfif);再者我没有忽略简单form字段,项目中用到了~~1:写一个过滤器吧,对所有的request请求都使用utf-8编码,有了它,所有乱码都不怕不怕啦// 这个方法我试了一下,在%WEB-ROOT%/WEB-INF/web.xml中添加了,但是没有什么明显效果,可能是我哪里没用对,我配置的具体情况见listting 1
package up;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class CharacterEncodingFilter implements Filter { private String config; public void destroy() { this.config = null; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req; req = (HttpServletRequest) request; HttpServletResponse res; res = (HttpServletResponse) response; req.setCharacterEncoding(config); res.setCharacterEncoding(config); chain.doFilter(req, res); } public void init(FilterConfig config) throws ServletException { this.config = config.getInitParameter("chars"); }}
CharacterEncodingFilter up.CharacterEncodingFilter chars utf-8 CharacterEncodingFilter /*
2.在上传的servlet中取得request的编码格式:
// 我不太明白这个所谓的“上传的servlet”指的是谁?反正我在接收form的页面使用request.getCharacterEncoding()得到的是null
String encoding=request.getCharacterEncoding();
3.解决上传文件的路径乱码问题: ServletFileUpload sfu = new ServletFileUpload(dfif);之后加上: sfu.setHeaderEncoding(encoding);4:解决表单字段的乱码: String(fileItem.getString(encoding));比如其中一项表单: String id1=new String(fileItem.getString(encoding));以此类推。5:这时候,如果还有问题,就可能是tomcat的配置问题了,找到server.xml,寻找到如下字段模仿修改即可 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>这几步完成后,乱码问题就彻底摆脱掉了~~~
listing 1.
下面是这个filter,我编译好之后放到了%WEB-ROOT%/WEB-INF/classes中
package cn.mldn.lxh.encoding.filter;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class CharacterEncodingFilter implements Filter { private String config; public void destroy() { this.config = null; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req; req = (HttpServletRequest) request; HttpServletResponse res; res = (HttpServletResponse) response; req.setCharacterEncoding(config); res.setCharacterEncoding(config); chain.doFilter(req, res); } public void init(FilterConfig config) throws ServletException { this.config = config.getInitParameter("chars"); }}
这个是%WEB-ROOT%/WEB-INF/web.xml
Welcome to Tomcat Welcome to Tomcat he /WEB-INF/hello.jsp he /hello.mldn dbinit /WEB-INF/init.jsp driver org.gjt.mm.mysql.Driver url jdbc:mysql://localhost:3306/mldn dbinit /config.mldn CharacterEncodingFilter cn.mldn.lxh.encoding.filter.CharacterEncodingFilter chars utf-8 CharacterEncodingFilter /*