读书人

java web 乱码经验补充2

发布时间: 2012-10-08 19:54:56 作者: rapoo

java web 乱码心得补充2

继续web乱码之路:

?

?? 上次说到的乱码问题,有个地方说到比较概况,就是文件上传的处理。

?

?? 通过form上传的方式我们可以知道:

?

?

?

multipart/form-data

不对字符编码。

在使用包含文件上传控件的表单时,必须使用该值。

?

?

??实际情况是什么样子呢 :

?

?? 浏览器监视下看看

?

    Request URL:http://localhost:8080/EMRSFramework/servlet.do?actionName=InfoMasterPageAction&flag=doUpdateMasterPageRequest Method:POSTStatus Code:java web 乱码经验补充2200 OK
  1. 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:InfoMasterPageAction
  • flag: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....();这种方式获取数据(java web 乱码经验补充2为什么是这样,大家自己研究下哈)。所以,服务器端(例如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;
    }

  • 读书人网 >Web前端

    热点推荐