关于上传图片出现乱码的问题
最近在赶一个小项目(我是菜鸟,没办法,只能慢工出细活),它是一个关于拉圈旅游,可以实现android端和Web端的小项目,android有点类似于QQ,而Web端有点类似于CSDN。只不过是关于旅游的。我用的是Myeclipse和MySQL。所有的处理都交给相应的Servlet(菜鸟嘛,呵呵呵),所有的数据处理交给DAO包里面的类。
昨天的进度到了Web端的上传图片及头像的上传于修改这个功能点上,根据需求,用户可以发布旅游地点,在发布的同时可以上传相关的景点图片,并且用户在注册的时候,可以上传头像,也可以以后再上传或者修改。
我在服务器端将所有的图片处理都封装在一个类(UpLoadImage)里面,并在各个页面的头像与图片显示的类型改为“file”,当然在相应的servlet中也作了相应的修改,并且在每个涉及到图图片上传的servlet中都使用了UpLoadImage这个类,并将获得的数据交给UpLoadImage类中的方法upload处理。返回一个Map类型的对象数组map,在servlet中将相关的数据从map中取出来。
下面是处理注册的servlet的关键代码:
req.setCharacterEncoding("utf-8");
String client = req.getHeader("client");
UpLoadImage upload=new UpLoadImage();
Map map = upload.upload(req,getServletContext().getRealPath
("uploadImage"));
username =""+map.get("username");
password =""+map.get("password");
nick_name =""+map.get("nick_name");
qq =""+map.get("qq");
sex =""+map.get("sex");
address =""+map.get("address");
icon="uploadImage\\"+map.get("upload_file_path");
System.out.println(" username="+username);
register.jsp页面的部分代码:
做如上处理之后,就可以上传图片了,可是,测试之后才发现,一切都仅仅只是我的臆测,乱码(只要是中文,结果就是乱码)出现了,我以输出username做测试:
我在注册表中填入相关信息:
输出的结果是:
啥玩意儿,明明是“你好”,到了数据库中却变成了乱码:
本来我以为是req.setCharacterEncoding("utf-8")这句代码出了问题,可当我将这句代码删了之后,还是乱码,之后,试了各种我已知道的办法,发现还是乱码。
后来,经过高人(赵工)指点,原来是服务器的编码设置与客户端的编码方式不一致。我将MyEclipse的编码都给改了,可还是不行。最后,赵工说,实在不行就强转。但我并不清楚我的MyEclipse的编码方式是什么,没办法,只能一个个试了。
页面的代码没变,改变的仅仅是servlet的代码,还是以输出username来测试:
req.setCharacterEncoding("utf-8");
System.out.println(" 1 username="+username);
username = new String( username.getBytes("iso8859-1"),
"utf-8");
System.out.println(" 2 username="+username);
username = new String(username.getBytes("iso8859-1"),
"gbk");
System.out.println(" 3 username="+username);
username = new String(username.getBytes("gbk"),"utf-8");
System.out.println(" 4 username="+username);
同样的填写及提交注册表单:
Myeclipse中的输出结果为:
数据库中的数据:
一切都出来了,很明显,我需要的仅仅只是将编码方式为iso8859-1的所有数据(仅仅是需要上传图片的相关的servlet里面的参数)强转为utf-8即可,即:
username = new String( username.getBytes("iso8859-1"),"utf-8");
password = new String( password.getBytes("iso8859-1"),"utf-8");
nick_name = new String( nick_name.getBytes("iso8859-1"),"utf-8");
qq = new String( qq.getBytes("iso8859-1"),"utf-8");
sex = new String( sex.getBytes("iso8859-1"),"utf-8");
address = new String( address.getBytes("iso8859-1"),"utf-8");
icon = new String( icon.getBytes("iso8859-1"),"utf-8");
一切都Ok了!那我再做一次测试:
同样的,填写表单:
提交之后,Myeclipse中的输出为:
数据库中存储的数据为:
这个为问题解决了。类似的问题,应该也可以用这种方法,当然,我是菜鸟,我还没有去试过。
以上仅仅只是我个人的观点,若对此有疑惑或者有什么问题的地方,欢迎各位高人给我以指点。谢谢!