关于jspsmartupload中文名文件上传后为乱码的问题

纯转载:http://www.knowsky.com/3136.html  
   
  看了一些但做完不支持大文件上传就又找别的方法了  
   
  jspSmartUpload虽然能下载文件,但对中文支持不足。若下载的文件名中有汉字,则浏览器在提示另存的文件名时,显示的是一堆乱码,很扫人兴。上面的例子就是这样。(这个问题也是众多下载组件所存在的问题,很少有人解决,搜索不到相关资料,可叹!)    
   
  为了给jspSmartUpload组件增加下载中文文件的支持,我对该组件进行了研究,发现对返回给浏览器的另存文件名进行UTF-8编码后,浏览器便能正确显示中文名字了。这是一个令人高兴的发现。于是我对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[i];  
  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服务器不支持中文链接。    
   
  小结:jspSmartUpload组件是应用JSP进行B/S程序开发过程中经常使用的上传下载组件,它使用简单,方便。现在我又为其加上了下载中文名字的文件的支持,真个是如虎添翼,必将赢得更多开发者的青睐。     
 

有问题?直接google! <script type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_sdo.js" type="text/javascript"></script>

<script type="text/javascript"> </script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值