java web 乱码经验补充2
java web 乱码心得补充2继续web乱码之路:??? 上次说到的乱码问题,有个地方说到比较概况,就是文件上传的处
java web 乱码心得补充2
继续web乱码之路:
?
?? 上次说到的乱码问题,有个地方说到比较概况,就是文件上传的处理。
?
?? 通过form上传的方式我们可以知道:
?
?
?
multipart/form-data
不对字符编码。
在使用包含文件上传控件的表单时,必须使用该值。
?
?
??实际情况是什么样子呢 :
?
?? 浏览器监视下看看
?
Request URL:http://localhost:8080/EMRSFramework/servlet.do?actionName=InfoMasterPageAction&flag=doUpdateMasterPageRequest Method:POSTStatus Code:
200 OK- Accept:application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5Accept-Charset:GBK,utf-8;q=0.7,*;q=0.3Accept-Encoding:gzip,deflate,sdchAccept-Language:zh-CN,zh;q=0.8Cache-Control:max-age=0Connection:keep-aliveContent-Length:707Content-Type:multipart/form-data; boundary=----WebKitFormBoundary0MLuYOGYSHLzVFByCookie:JSESSIONID=C16F7745C585B808DE7597B1EFC2C9B9Host:localhost:8080Origin:http://localhost:8080Referer:http://localhost:8080/EMRSFramework/servlet.do?actionName=infoIndexActionUser-Agent:Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16
actionName:InfoMasterPageActionflag:doUpdateMasterPage------WebKitFormBoundary0MLuYOGYSHLzVFByContent-Disposition: form-data; name="masterPageId"4------WebKitFormBoundary0MLuYOGYSHLzVFByContent-Disposition: form-data; name="masterPageDesc"????????·???4------WebKitFormBoundary0MLuYOGYSHLzVFByContent-Disposition: form-data; name="firstMasterOrder"4------WebKitFormBoundary0MLuYOGYSHLzVFByContent-Disposition: form-data; name="masterOrder"4------WebKitFormBoundary0MLuYOGYSHLzVFByContent-Disposition: form-data; name="XSLPath"; filename=""Content-Type: application/octet-stream------WebKitFormBoundary0MLuYOGYSHLzVFByContent-Disposition: form-data; name="submit"??′?–°------WebKitFormBoundary0MLuYOGYSHLzVFBy--?
?
???好的大家着重看看红色字体部分,大家会发现浏览器根本就没有提交编码格式给服务器,包括默认编码格式。
?
??OK,这个时候我们可以参考我前两篇文章所说:提交的数据位当前页面的编码格式(<meta?http-equiv="Content-Type"?content="text/html;?charset=GBK"> ?)。
?
?
?? 那么服务端接收数据时如何操作呢?大家都知道我们文件上传都采用上传的组件工具例如(commons-fileupload),获取上传的数据信息,而并非采用默认的request.getPara....();这种方式获取数据(
为什么是这样,大家自己研究下哈)。所以,服务器端(例如tomcat)的默认解码根本就么有用到。
??好的,到了这里大家估计也看出来了,解码过程毫无疑问交给了文件上传的组件来处理了。好的,那么文件上传组件如何解码呢,这个与组件的处理有关,这里说下 commons-fileupload; 大家看下代码的红色部分,如果大家设置了这些编码格式,那么上传的数据会被采用utf-8解析,否则?commons-fileupload默认采用 iso8859-1解析。
public List<FileItem> getFileList(HttpServletRequest request) throws Exception{
???List<FileItem> files=new ArrayList<FileItem>();
?????DiskFileUpload fu = new DiskFileUpload ();
?????fu.setHeaderEncoding("UTF-8");//关键
?????fu.setSizeMax(200000000);
?????List fileItems = fu.parseRequest(request);
?????int length=fileItems.size();
????for(int i=0;i<length;i++){
?????FileItem fi=(FileItem)fileItems.get(i);
?????if (fi.isFormField()){
??????String name = fi.getFieldName();
?????????String value = new String(fi.getString("utf-8"));
?????????System.out.println("value"+value);
??????parameters.put(name,value);
??????}else{
?????if((fi.getName()==null||fi.getName().equals(""))&&(fi.getSize()==0)){
?????}else{
??????????files.add(fi);
??????????}
?????}
???????}
?????return files;
}