JSP SmartUpload上传文件乱码解决纪实+UploadBean上传解决方案

来源:互联网 发布:stata做面板数据回归 编辑:程序博客网 时间:2024/05/20 00:12

作者:fbysss
声明:本文为fbysss原创,如需引用,请注明作者及引用地址

关键字:smartupload,uploadbean,linux,中文乱码
一、SmartUpload上传文件乱码解决纪实
      恶心指数:五星
      完成程度:80%(文件名问题未解决)

      问题描述:在windows下开发的web应用,用到了smartupload上传文件,需求很简单,就是一个表单文件formdata.jsp,一个获取表单并上传的文件getdata.jsp,调试的时候,windows和linux系统下均正常,当系统安装到另一台服务器的时候,却出现了获取表单参数值为乱码(全是问号???)的问题。
       我脑子里面第一感觉是:两台机器,据同事说是同一张光盘安装的Linux,但我想,根据逻辑推断,肯定是这liux装得不一样,或者是相关的服务不一样。否则怎么可能呢?然而,上头任务交给我来解决了,而且系统马上要正式使用,如果我要求重新安装Linux,几乎是不可能的。那好,我不入地狱,谁入地狱?我就闯它一把。
      其实在这个时候,我还认为问题不大的。因为java开发的东西,乱码问题是家常便饭,而解决办法也就是那几种。不就一个转码吗?当时头儿问我问题大不大,我说,应该没啥大问题。
我开始进行getByte()转码,用ISO-8859-1 与gb312/GBK”互相转换,未果,又加入UTF-8,不行;
又在<%@ page contentType="text/html;charset=gb2312">进行编码替换,不行;
修改linux LANG=zh_CN.GB2312,不行;
修改web.xml的charset,不行;

        此时我几乎已经查遍了所有有关的网页,而且找到这问题和smartupload有关。但解决的人寥寥无几,而且解决的办法也很不详细,于是在csdn上发帖,结果半天没人理会,顶都没人顶。再上开发群上问,大家都忙,也无暇顾及。继续自己调试,用System.getProperty(“file.encoding”)得到的结果是ANSI_X3.4-1968,这是个什么码?上google查了一下,全是些无用信息,此时我心里不禁有些发冷。。。NND,问题有些严重。。
        当天到下班,我是没啥结果,已经头昏脑胀,不想加班了,但花大半天时间还没搞定这么一个“小问题”,实在是有些没面子,于是我向头儿保证,明天我一定解决。
        回到屋里,茶不思饭不香。上QQ看看,跟一MM聊了几句,我说今天好累,她说我明天可以好好休息一下。啊?明天星期几?我一核实,靠,明天周六啊!看来老天注定要我周末加班了。
        晚上没睡好,起来又是一顿查,还是没啥好办法。
        第二天,11点才起床,起来煮碗面条就开始干,把那些编码用new String(str.getByte(“iso-8859-1“),“gbk“)这样的形式进行了若干中组合,不行,怎么办,看到有一个改smartupload源码的解决办法,我是很不想改源码的,因为服务器在远程,我没有root帐号,修改了类无法重启。
        进展一:把formdata.jsp中<%@ page contentType="text/html;charset=gb2312">,取掉,加上<meta http-equiv="Content-Type" content="text/html; charset=gb2312">,获取页面转码后能够正常显示中文。但是,大家都知道,这样做的后果是什么,formdta.jsp无法显示中文!这个问题更难做了,而且用response.setContentType居然对页面没有任何作用,真邪门了。
        时间一点点过去,我终于动摇了,我开始试着去记忆root的密码,试了一下,我靠居然是对的。OK,终于可以大展拳脚了。
        然而,smartupload的源码,居然很不好找,搜了半天没有。只好反编译了。用gel反编译出来的结果跟别人说的还不一样,就凑合着改了一下,
找到SmartUpload.java中的    public void upload(),加一个参数String charsetName,
找到这句 String s11 = new String(m_binArray, m_startData, (m_endData - m_startData) + 1);
修改为String s11 = new String(m_binArray, m_startData, (m_endData - m_startData) + 1,charsetName);
编译后上传,重启再试,发现有了一点进展。
        进展二:部分参数能够正确读取了!
        这只是表单文本框传值可以了,可文件名依然是乱码,我又折腾了半天,实在不想再去弄那个smartupload的源码了,虽然代码不多,但是我这么弄也太花时间了。(注:我觉得改源码应该可以解决问题,只是没有改完,文件名那部分需要进行处理。有兴趣的可以试试)

        这时自然想到了换其他的上传包,搜了一下,有人说javazoom的不错,搞一个下来再说,demo很简单,
测试之后发现,只要在接收页面getdata.jsp中转码就可以了。转码方式,可以是一个个参数单独转,也可以用一句话就可以:request.setCharacterEncoding("GBK");同时要配合
MultipartFormDataRequest(request,null,100*1024*1024,MultipartFormDataRequest.COSPARSER,"GBK");
这个uploadbean的做的非常体贴,居然提供一个ChineseUpload.jsp例子,其实主要就是上面两句话不同。
        等我修改完,感觉差不多的时候,已经是深夜2点。想放松了,先睡再说。
       周日,继续工作,发现一个新问题,uploadbean居然不能修改上传的文件名!这怎么行呢?是有一种变通方法,每个文件建立一个目录,然后放进去防止重名,但这有点恶心,而且直接进去的文件名还是乱码,这可咋整啊???
       还好,我再次发现了UploadBean的优越性,我找到了一个帖子,说UploadBean1.5配合Filemover可以改名,于是又下了1.5和FileMover,FileMover中的例子也很详细简单。真是贴心。。。
       修改,上传重启,一切OK!
       后来,又发现系统的几个相关BUG,一鼓作气,全部解决。

       这个“小问题”,居然花了我整整两天的时间,可谓令我恼怒!同时,也想到跟我同样痛苦的兄弟们,我能减轻一下你们的痛苦,我这两天就没白干!我现在的口号是:“放弃SmartUpload,全面使用UploadBean”。我还写了一个Demo,以帮助痛苦的兄弟们快速解决问题。
       下面,我把我写的Demo和需要的资料链接都贴在这里,大家有什么问题可以在这里跟我交流。

二、UploadBean上传解决方案
    满意指数:五星
    完成程度:100%
 Demo:
1.表单页面sssformdata.jsp
<%@ page contentType="text/html;charset=gb2312"  %>
<head>
<title>fbysss UploadBean 示例</title>
<!--meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"-->
<!--meta http-equiv="Content-Type" content="text/html; charset=gb2312"-->
</head>
<FORM   name="form1" METHOD="POST" ACTION="sssupload.jsp" ENCTYPE="multipart/form-data">
      <input name="title" type= "text" value="中文字">
      <td class="bodystyle">附件</td>
      <td class="bodystyle"> <input name="attach" type="FILE" id="attach" size="50" > </td>
      <input name="ok" type= "submit" value="提交">
</form>

2.读取表单并上传页面sssupload.jsp
<!--
 //==========================================================================
 //文件:UploadBean上传实例
 //功能:解决中文乱码,完成文件上传,并提供上传改名解决方案
 //作者:fbysss
 //msn:jameslastchina@hotmail.com
 //==========================================================================
-->
<%@ page contentType="text/html;charset=GBK" %>
<%@ page language="java" import="com.jspsmart.upload.*"%>
<%@ page import="java.text.SimpleDateFormat"%>
<%@ page import="java.io.File"%>
<%@ page import="java.util.*"%>
<%@ page import="javazoom.upload.*"%>
<%@ page import="uploadutilities.FileMover"%>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<% 
      request.setCharacterEncoding("GBK");//设置编码格式,就不用一个个转码了。
      FileMover fileMover = new FileMover();//你也可以使用自带的实例中jsp:useBean的形式。
   UploadBean upBean = new UploadBean();
      MultipartFormDataRequest mrequest = null;
   Hashtable files = null;
  
   if (MultipartFormDataRequest.isMultipartFormData(request))
      {

   mrequest = new MultipartFormDataRequest(request,null,100*1024*1024,MultipartFormDataRequest.COSPARSER,"GBK");//注意这里也要设置编码参数
     String sTt0 = mrequest.getParameter("title");
     out.println("<br>Title0是:"+sTt0+"<br>");
     String sTt1 = new String(sTt0.getBytes("ISO-8859-1"),"GBK");
     out.println("<br>Title1是:"+sTt1+"<br>");
     //这里用来测试title参数是否正确。调试的时候,加一句if (true)return;即可。
         files = mrequest.getFiles();
   }


 //获取修改前的文件名
 String sOldFileName =mrequest.getParameter("oldfilename");
 out.println("sOldFileName:"+sOldFileName);
 String sWebRootPath = request.getRealPath("/");//得到你的web应用的根。
 String sPath=sWebRootPath+"attach";
 int iFileCount = 0;
 String sServerFileName="";
 String sLocalFileName = "";
 //文件获取
 if ( (files != null) || (!files.isEmpty()) ) {
 
  iFileCount = files.size();
  UploadFile file = (UploadFile) files.get("attach");
  sLocalFileName=file.getFileName();
  out.println("sLocalFileName:"+sLocalFileName);
  int ii= sLocalFileName.indexOf("."); //取文件名的后缀
  String sExt = sLocalFileName.substring(ii,sLocalFileName.length());
  //得到不重复的文件名
  java.util.Date dt = new java.util.Date(System.currentTimeMillis());
  SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMddHHmmssSSS");
  sServerFileName= fmt.format(dt);
  sServerFileName =sServerFileName + sExt;
  //如果不存在该目录,则新建一个
  File dir =new File(sPath);
  if (!dir.exists()){
   dir.mkdirs();
  }
  upBean.setFolderstore(sPath);//设置要上传的目录
  upBean.addUploadListener(fileMover);//增加filMover监听
  fileMover.setNewfilename(sServerFileName);//设置服务器上的文件名
  upBean.store(mrequest, "attach");//上传
  out.println("file path is "+sPath+"/"+sServerFileName);
 }

%>

Demo注意事项:cos.jar,uploadbean.jar,filemover.jar这几个包必须有。
必备下载地址:
UploadBean1.5:http://wcarchive.cdrom.com/pub/simtelnet/winnt/java/uploadbean1_5.zip
FileMover1.3:http://www.javazoom.net/jzservlets/uploadbean/addons/filemover1.3.zip
参考下载地址:
ChinesUpload例子:http://www.javazoom.net/jzservlets/uploadbean/addons/ChineseUpload.zip

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 20天的宝宝便秘怎么办 出生23天的宝宝便秘怎么办 喝奶粉的宝宝便秘怎么办 抱孩子抱的驼背怎么办 4岁宝宝不拉屎怎么办 小朋友大便拉不出来怎么办 儿童便秘拉不出来怎么办 没感冒喉咙有痰怎么办 宝宝喂不进去药怎么办 新生儿只放屁不拉大便怎么办 新生儿腹胀不拉大便怎么办 8月宝宝咳嗽有痰怎么办 2个月婴儿惊吓怎么办 吃了米粉不拉屎怎么办 奇异果奶昔苦了怎么办 8个月宝宝偏瘦怎么办 一岁宝宝螺旋腿怎么办 七个月宝宝晚上咳嗽厉害怎么办 孕7个月感冒咳嗽怎么办 4个月婴儿肺炎怎么办 宝宝吃胡萝卜泥拉肚子怎么办 宝宝吃土豆泥不消化怎么办 五个月宝宝奶睡怎么办 橘子和牛奶一起吃了怎么办 半岁宝宝不喝水怎么办 一岁宝宝总是便秘怎么办 1岁的宝宝不喝水怎么办 两月宝宝不喝水怎么办 破壁机打出的果汁很浓稠怎么办 榨的果汁不甜怎么办 11个月宝宝吃盐怎么办 1岁半宝宝长牙慢怎么办 小孩里面的牙黑怎么办 7个半月宝宝便秘怎么办 2个月婴幼儿便秘怎么办 3个月宝宝不消化怎么办 一天大便二三次不消化怎么办 不消化没胃口几天不大便怎么办? 两个月的宝宝拉绿屎怎么办 肠胃不好消化功能差怎么办 2岁宝宝消化不好怎么办