博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
fileupload的乱码解决
阅读量:7098 次
发布时间:2019-06-28

本文共 6523 字,大约阅读时间需要 21 分钟。

解决方法就是这段代码,其中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封顶 List
items = 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");  }}

下面的配置也非常的重要,不可忽略!!在web.xml里面加上下面的一段话:

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
/*

 

转载地址:http://lkhql.baihongyu.com/

你可能感兴趣的文章
T-Mobile证实数据泄露 但客户暂无风险
查看>>
使用 MEF 公开 Silverlight“.NET研究” MVVM 应用程序中的接口
查看>>
Random Sequence 2011ACM福州赛区网络赛
查看>>
node.js 文件操作
查看>>
异常不可用于逻辑处理
查看>>
小米手机如期而至
查看>>
STM32 RCC实验 MCO脚输出时钟波形
查看>>
Flash 最小化,帧速变慢的问题
查看>>
java对redis的基本操作(一)
查看>>
基因组印记
查看>>
34个漂亮的应用程序后台管理界面(系列三)
查看>>
double free or corruption (!prev): 0x080644c8 ***
查看>>
在VMware上搭建iPhone开发环境(转)
查看>>
MongoCola使用教程 1 - MongoDB的基本操作和聚合功能
查看>>
2012年3月份30个优秀的jquery插件集合 功能强大
查看>>
公共的Json操作C#类
查看>>
WebService如何调试及测试工具
查看>>
HDU-2091 水题
查看>>
【转】条件编译#ifdef的妙用详解_透彻
查看>>
jQuery.autocomplete 支持中文输入
查看>>