继续web乱码之路:
上次说到的乱码问题,有个地方说到比较概况,就是文件上传的处理。
通过form上传的方式我们可以知道:
multipart/form-data | 不对字符编码。 在使用包含文件上传控件的表单时,必须使用该值。 |
实际情况是什么样子呢 :
浏览器监视下看看
-
Request URL:http://localhost:8080/EMRSFramework/servlet.do?actionName=InfoMasterPageAction&flag=doUpdateMasterPage
-
Request Method:POST
-
Status Code:200 OK
好的大家着重看看红色字体部分,大家会发现浏览器根本就没有提交编码格式给服务器,包括默认编码格式。
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;
}