fileupload的乱码解决
解决方法就是这段代码,其中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
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action=".\jsp\fileupload_demo01.jsp" method="post" enctype="multipart/form-data">
姓名:<input type="text" name="uname"><br>
照片:<input type="file" name="pic"><br>
<input type="submit" value="上传">
<input type="reset" value="重置">
</form>
</body>
</html>
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;" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8") ;
%>
<%
DiskFileItemFactory factory = new DiskFileItemFactory() ;
ServletFileUpload upload = new ServletFileUpload(factory) ;
upload.setFileSizeMax(3 * 1024 * 1024) ; // 单个文件大小3M封顶
List<FileItem> items = upload.parseRequest(request) ; // 接收全部内容
Iterator<FileItem> iter = items.iterator() ;
while(iter.hasNext()){
FileItem item = iter.next() ;
String fieldName = item.getFieldName() ; // 取得表单控件的名称
%>
<ul><h4><%=fieldName%> --> <%=item.isFormField()%></h4>
<%
if(!item.isFormField()){ // 不是普通文本
String fileName = item.getName() ; // 取得文件的名称
String contentType = item.getContentType() ; // 文件类型
long sizeInBytes = item.getSize() ;
%>
<li>上传文件名称:<%=fileName%>
<li>上传文件类型:<%=contentType%>
<li>上传文件大小:<%=sizeInBytes%> bytes
<%
} else {
String value = item.getString("UTF-8");
%>
<li>普通参数:<%=value%>
<%
}
%> </ul>
<%
}
%>
</body>
<h2>上传成功,<a href="..\fileupload_demo01.html">返回</a></h2>
</html>
下面是在网上找到的资料:
-------------------------------------
最近一直在整上传图片的东西,改了很长时间,实验了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里面加上下面的一段话:
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>up.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>chars</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
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
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>Welcome to Tomcat</display-name>
<description>Welcome to Tomcat</description> <servlet>
<servlet-name>he</servlet-name>
<jsp-file>/WEB-INF/hello.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>he</servlet-name>
<url-pattern>/hello.mldn</url-pattern>
</servlet-mapping> <servlet>
<servlet-name>dbinit</servlet-name>
<jsp-file>/WEB-INF/init.jsp</jsp-file>
<init-param>
<param-name>driver</param-name>
<param-value>org.gjt.mm.mysql.Driver</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mldn</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dbinit</servlet-name>
<url-pattern>/config.mldn</url-pattern>
</servlet-mapping>
<!-- 这个就是我配置的那个filter -->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>cn.mldn.lxh.encoding.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>chars</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
fileupload的乱码解决的更多相关文章
- java中文乱码解决之道(九)-----总结
乱码,我们前台展示的杀手,可能有些朋友和我的经历一样:遇到乱码先按照自己的经验来解决,如果没有解决就google,运气好一搜就可以解决,运气不好可能够你折腾一番了.LZ之所以写这个系列博客就是因为遇到 ...
- Javaee中文乱码解决方法
分类: javaee2015-07-09 16:35 29人阅读 评论(0) 收藏 编辑 删除 post 中文乱码解决方式 接受数据的时候设置 request.setCharacterEncoding ...
- java中文乱码解决之道(二)-----字符编码详解:基础知识 + ASCII + GB**
在上篇博文(java中文乱码解决之道(一)-----认识字符集)中,LZ简单介绍了主流的字符编码,对各种编码都是点到为止,以下LZ将详细阐述字符集.字符编码等基础知识和ASCII.GB的详情. 一.基 ...
- java中文乱码解决之道(七)-----JSP页面编码过程
我们知道JSP页面是需要转换为servlet的,在转换过程中肯定是要进行编码的.在JSP转换为servlet过程中下面一段代码起到至关重要的作用. <%@ page language=" ...
- Arch Linux中文乱码解决
Arch Linux中文乱码解决 1.安装中文字体 pacman -S wqy-zenhei ttf-fireflysung (flash乱码) ---乱码的原因就是缺少中文字体的支持,下载文泉驿 ...
- [Linux] - CentOS中文乱码解决办法
CentOS 7 终端中文乱码解决办法: 1.使用vim编辑locale.config文件: vim /etc/locale.conf 2.将LANG="en_US.UTF-8"修 ...
- ubuntu文本模式/终端中文乱码解决
ubuntu文本模式/终端中文乱码解决 1.Alt+Ctrl+F1 进入第一个终端tty1,发现中文乱码. 2.安装zhcon. sudo apt-get install zhcon3 输入下面命令, ...
- 爬虫爬数据时,post数据乱码解决办法
最近在写一个爬虫,目标网站是:http://zx.bjmemc.com.cn/,可能是为了防止被爬取数据,它给自身数据加了密.用谷歌自带的抓包工具也不能捕获到数据.于是下了Fiddler. F ...
- MySql数据库乱码解决方法
MySql数据库乱码解决方法 解决乱码问题一个原则:存取系统使用一致的编码规则. 多使用mysql的原生命令行,这样才能做更多的事情. 第一步: 确认应用系统需要使用的编码 java的默认编码是跟 ...
随机推荐
- java 如何查看jdk版本&位数
java 如何查看jdk版本&位数 CreateTime--2018年4月22日18:20:18 Author:Marydon 方式一:通过dos命令实现 win+R-->cmd-- ...
- ORACLE经常使用命令
1 怎样查看数据库中都有什么表? select * from sys.user_tables; 2 怎样链接数据库 sqlplus /nolog;conn sys/oracle as sysdba; ...
- 更改npm全局模块和cache默认安装位置
来源于:http://blog.csdn.net/friendan/article/details/51736231 1.因为我安装的Node.js自带了npm,所以在nodejs文件夹里面新建以下两 ...
- PHP生成缩略图、加水印
<?php class ThumbWaterImages{ /** * 生成缩略图/加水印 * classname ThumbWaterImages * datetime:2015-1-15 * ...
- PHP-中文在计算机中的存储
经常我们打开外国网站的时候出现乱码,又或者打开很多非英语的外国网站的时候,显示的都是口口口口口的字符, WordPress程序是用的UTF-8,很多cms用的是GB2312. ● 为什么有这么多编码? ...
- 浅谈软件配置管理工具(github & SVN)
1 配置管理名词定义 1.1 配置项 软件生存周期各个阶段活动的产物经审批后即可称之为软件配置项. 软件配置项包括: ①与合同.过程.计划和产品有关的文档和资料: ②源代码.目标代码和可执行代码: ...
- linux 浏览查看文件more,less,head,tail,cat,tac,od,nl命令使用简介
参考:linux 基本命令详解 cat,tac,nl,more,less,head,tail,od 命令more,less,head,tail,cat,tac,od,nl等是是使用Linux系统常用的 ...
- POJ 3006 Dirichlet's Theorem on Arithmetic Progressions (素数)
Dirichlet's Theorem on Arithmetic Progressions Time Limit: 1000MS Memory Limit: 65536K Total Submi ...
- Android笔记(十)ListView
ListView是Android中最经常使用的控件之中的一个,也是最难用的控件. ListView的作用是展示大量的数据,只是ListView并非直接和数据打交道.而是通过适配器作为中间桥梁. 1.首 ...
- atcoder之A Great Alchemist
C - A Great Alchemist Time limit : 2sec / Stack limit : 256MB / Memory limit : 256MB Problem Carol i ...