smartUpload解决乱码之道

     

现象:采用smartupload上传文件时获取文件名及相关参数()时乱码.
原因:上传文件的页面会以页面指定的编码格式对上传的数据进行编码,smartupload在接收数据时会以系统默认的编码解码上传数据,如果页面编码与系统编码不一致,则会导致乱码
下面两种方式任选一种即可解决乱码问题:
1.指定页面编码与系统编码一致:<meta http-equiv="Content-Type" content="text/html; charset=utf-8">,对于windows操作系统应为gbk,对于linux,要指定为export|grep LANG中一致的编码格式.
2.修改smartupload.jar中的SmartUpload.java中: String s11 = new String(m_binArray, m_startData, (m_endData - m_startData) + 1); 和getDataHeader方法中类似部分,加入charSet参数,手动指定编码.
jspSmartUpload组件的SmartUpload类做了升级处理,增加了toUtf8String这个方法,改动部分源码如下:    
  public   void   downloadFile(String   s,   String   s1,   String   s2,   int   i)  
  throws   ServletException,   IOException,   SmartUploadException  
          {  
  if(s   ==   null)  
          throw   new   IllegalArgumentException("File   '"   +   s   +  
          "'   not   found   (1040).");  
  if(s.equals(""))  
          throw   new   IllegalArgumentException("File   '"   +   s   +  
          "'   not   found   (1040).");  
  if(!isVirtual(s)   &&   m_denyPhysicalPath)  
          throw   new   SecurityException("Physical   path   is  
          denied   (1035).");  
  if(isVirtual(s))  
          s   =   m_application.getRealPath(s);  
  java.io.File   file   =   new   java.io.File(s);  
  FileInputStream   fileinputstream   =   new   FileInputStream(file);  
  long   l   =   file.length();  
  boolean   flag   =   false;  
  int   k   =   0;  
  byte   abyte0[]   =   new   byte ;  
  if(s1   ==   null)  
          m_response.setContentType("application/x-msdownload");  
  else  
  if(s1.length()   ==   0)  
          m_response.setContentType("application/x-msdownload");  
  else  
          m_response.setContentType(s1);  
  m_response.setContentLength((int)l);  
  m_contentDisposition   =   m_contentDisposition   !=   null   ?  
  m_contentDisposition   :   "attachment;";  
  if(s2   ==   null)  
          m_response.setHeader("Content-Disposition",    
          m_contentDisposition   +   "   filename="   +    
          toUtf8String(getFileName(s)));  
  else  
  if(s2.length()   ==   0)  
          m_response.setHeader("Content-Disposition",    
          m_contentDisposition);  
  else  
          m_response.setHeader("Content-Disposition",    
          m_contentDisposition   +   "   filename="   +   toUtf8String(s2));  
  while((long)k   <   l)  
  {  
          int   j   =   fileinputstream.read(abyte0,   0,   i);  
          k   +=   j;  
          m_response.getOutputStream().write(abyte0,   0,   j);  
  }  
  fileinputstream.close();  
          }  
    
          /**  
            *   将文件名中的汉字转为UTF8编码的串,以便下载时能正确显示另存的文件名.  
            *   纵横软件制作中心雨亦奇2003.08.01  
            *   @param   s   原文件名  
            *   @return   重新编码后的文件名  
            */  
          public   static   String   toUtf8String(String   s)   {  
  StringBuffer   sb   =   new   StringBuffer();  
  for   (int   i=0;i<s.length();i++)   {  
          char   c   =   s.charAt(i);  
          if   (c   >=   0   &&   c   <=   255)   {  
  sb.append(c);  
          }   else   {  
  byte[]   b;  
  try   {  
          b   =   Character.toString(c).getBytes("utf-8");  
  }   catch   (Exception   ex)   {  
          System.out.println(ex);  
          b   =   new   byte[0];  
  }  
  for   (int   j   =   0;   j   <   b.length;   j++)   {  
          int   k   =   b[j];  
          if   (k   <   0)   k   +=   256;  
          sb.append("%"   +   Integer.toHexString(k).  
          toUpperCase());  
  }  
          }  
  }  
  return   sb.toString();  
          }  
      
    
    
  注意源码中粗体部分,原jspSmartUpload组件对返回的文件未作任何处理,现在做了编码的转换工作,将文件名转换为UTF-8形式的编码形式。UTF-8编码对英文未作任何处理,对中文则需要转换为%XX的形式。toUtf8String方法中,直接利用Java语言提供的编码转换方法获得汉字字符的UTF-8编码,之后将其转换为%XX的形式。    
    
  将源码编译后打包成jspSmartUpload.jar,拷贝到Tomcat的shared/lib目录下(可为所有WEB应用程序所共享),然后重启Tomcat服务器就可以正常下载含有中文名字的文件了。另,toUtf8String方法也可用于转换含有中文的超级链接,以保证链接的有效,因为有的WEB服务器不支持中文链接

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值