`
licg1234
  • 浏览: 49628 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

java web 乱码心得补充2

阅读更多

继续web乱码之路:

 

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

 

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

 

 

 

multipart/form-data

不对字符编码。

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

 

 

  实际情况是什么样子呢 :

 

   浏览器监视下看看

 

  1. Request URL:
    http://localhost:8080/EMRSFramework/servlet.do?actionName=InfoMasterPageAction&flag=doUpdateMasterPage
  2. Request Method:
    POST
  3. Status Code:
    200 OK
  4. Request Headers
    1. Accept:
      application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
    2. Accept-Charset:
      GBK,utf-8;q=0.7,*;q=0.3
    3. Accept-Encoding:
      gzip,deflate,sdch
    4. Accept-Language:
      zh-CN,zh;q=0.8
    5. Cache-Control:
      max-age=0
    6. Connection:
      keep-alive
    7. Content-Length:
      707
    8. Content-Type:
      multipart/form-data; boundary=----WebKitFormBoundary0MLuYOGYSHLzVFBy
    9. Cookie:
      JSESSIONID=C16F7745C585B808DE7597B1EFC2C9B9
    10. Host:
      localhost:8080
    11. Origin:
      http://localhost:8080
    12. Referer:
      http://localhost:8080/EMRSFramework/servlet.do?actionName=infoIndexAction
    13. User-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
  5. Query String Parameters
    1. actionName:
      InfoMasterPageAction
    2. flag:
      doUpdateMasterPage
  6. Request Payload
    1. ------WebKitFormBoundary0MLuYOGYSHLzVFBy Content-Disposition: form-data; name="masterPageId" 4 ------WebKitFormBoundary0MLuYOGYSHLzVFBy Content-Disposition: form-data; name="masterPageDesc" 框架样式4 ------WebKitFormBoundary0MLuYOGYSHLzVFBy Content-Disposition: form-data; name="firstMasterOrder" 4 ------WebKitFormBoundary0MLuYOGYSHLzVFBy Content-Disposition: form-data; name="masterOrder" 4 ------WebKitFormBoundary0MLuYOGYSHLzVFBy Content-Disposition: form-data; name="XSLPath"; filename="" Content-Type: application/octet-stream ------WebKitFormBoundary0MLuYOGYSHLzVFBy Content-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;
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics